精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

JavaScript 異步編程指南 - 探索瀏覽器中的事件循環(huán)機(jī)制

開(kāi)發(fā) 前端
當(dāng)我了解事件循環(huán)時(shí),嘗試去找一些規(guī)范來(lái)學(xué)習(xí),但是查遍 EcmaScript 或 V8 發(fā)現(xiàn)它們沒(méi)有這個(gè)東西的定義,例如,在 v8 里有的是執(zhí)行棧、堆這些信息。確實(shí),事件循環(huán)不在這里。

[[429067]]

當(dāng)我了解事件循環(huán)時(shí),嘗試去找一些規(guī)范來(lái)學(xué)習(xí),但是查遍 EcmaScript 或 V8 發(fā)現(xiàn)它們沒(méi)有這個(gè)東西的定義,例如,在 v8 里有的是執(zhí)行棧、堆這些信息。確實(shí),事件循環(huán)不在這里。

后來(lái)才逐漸的了解到,當(dāng)在瀏覽器環(huán)境中,關(guān)于事件循環(huán)相關(guān)定義是在 HTML 標(biāo)準(zhǔn)中,之前 HTML 規(guī)范由 whatwg 和 w3c 制定,兩個(gè)組織都有自己的不同,2019 年時(shí)兩個(gè)組織簽署了一項(xiàng)協(xié)議 就 HTML 和 DOM 的單一版本進(jìn)行合作,最終,HTML、DOM 標(biāo)準(zhǔn)最終由 whatwg 維護(hù)。

本文的講解主要也是以 whatwg 標(biāo)準(zhǔn)為主,在 HTML Living Standard Event loops 中,這個(gè)規(guī)范定義了瀏覽器內(nèi)核該如何的去實(shí)現(xiàn)它。

瀏覽器規(guī)范中的事件循環(huán)

事件循環(huán)定義

為了協(xié)調(diào)事件、用戶(hù)交互、腳本、渲染、網(wǎng)絡(luò)等,用戶(hù)代理必須使用本節(jié)描述的事件循環(huán)。每個(gè)代理有一個(gè)關(guān)聯(lián)的事件循環(huán),它對(duì)每個(gè)代理是唯一的。

To coordinate events, user interaction, scripts, rendering, networking, and so forth, user agents must use event loops as described in this section. Each agent has an associated event loop, which is unique to that agent.

從這個(gè)定義也可看出,事件循環(huán)主要是用來(lái)協(xié)調(diào)事件、網(wǎng)絡(luò)、JavaScript 等之間的一個(gè)運(yùn)行機(jī)制,我們以 JavaScript 為出發(fā)點(diǎn)來(lái)看下它們之間是如何交互的。

事件循環(huán)中有一個(gè)重要的概念任務(wù)隊(duì)列,它決定了任務(wù)的執(zhí)行順序。

事件循環(huán)的處理模式

規(guī)范 8.1.6.3 處理模型 定義了事件循環(huán)的處理模式,當(dāng)一個(gè)事件循環(huán)存在,它就會(huì)不斷的執(zhí)行以下步驟:

這些概念很晦澀難懂,簡(jiǎn)單總結(jié)下:

  • 執(zhí)行 Task:任務(wù)隊(duì)列有多個(gè)任務(wù)源(DOM、UI、網(wǎng)絡(luò)等)隊(duì)列,從中至少選出一個(gè)可運(yùn)行的任務(wù),放到 taskQueue 中。
    • 如果沒(méi)有直接跳到微任務(wù)隊(duì)列,就不會(huì)經(jīng)過(guò) 2 ~ 5。
    • 否則從 taskQueue 中取出第一個(gè)可執(zhí)行任務(wù)做為 oldestTask 執(zhí)行,對(duì)應(yīng) 2 ~ 5。
    • 注意,微任務(wù)不會(huì)在這里被選中,但是當(dāng)一個(gè)任務(wù)隊(duì)列里含有微任務(wù),會(huì)將該微任務(wù)加入微任務(wù)隊(duì)列。
    • 執(zhí)行 Microtask:執(zhí)行微任務(wù)隊(duì)列,直到微任務(wù)隊(duì)列為空,這里如果調(diào)度太多的微任務(wù)也會(huì)導(dǎo)致阻塞。
    • 更新渲染。

看到一個(gè)圖,描述一次事件循環(huán)的過(guò)程,差不多就是這個(gè)意思,主要呢,還是這三個(gè)階段:Task、Microtask、Render 下文會(huì)展開(kāi)的討論。

圖片來(lái)源:https://pic2.zhimg.com/80/v2-38e53b9df2d13e9470c31101bb82dbb1_1440w.jpg

Task(Macrotask)

之前也看過(guò)很多文章關(guān)于事件循環(huán)的介紹,**大多會(huì)把 “Task” 當(dāng)作 “Marcotask” 也就是宏任務(wù)來(lái)介紹,但是在規(guī)范中沒(méi)有所謂的 “Marcotask”,**因?yàn)橐?guī)范里沒(méi)有這個(gè)名詞,所以我在這個(gè)標(biāo)題上特意加了個(gè)括號(hào),有很多的叫法,也有稱(chēng)為外部隊(duì)列的,這其實(shí)是一個(gè)意思,如果你是學(xué)習(xí)事件循環(huán)的新朋友可能就會(huì)有疑問(wèn),為什么我搜索不到關(guān)于這個(gè)的解釋。

下文我會(huì)繼續(xù)使用規(guī)范中的名詞 “任務(wù)隊(duì)列” 來(lái)表達(dá)。

任務(wù)隊(duì)列是一個(gè)任務(wù)的集合。事件循環(huán)有一個(gè)或多個(gè)任務(wù)隊(duì)列,事件循環(huán)做的第一步是從選擇的隊(duì)列中獲取第一個(gè)可運(yùn)行的任務(wù),而不是出列第一個(gè)任務(wù)。

傳統(tǒng)的隊(duì)列(Queue)是一個(gè)先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),總是排在第一個(gè)的先執(zhí)行,而這里的隊(duì)列里面會(huì)包含一些類(lèi)似于 setTimeout 這樣延遲執(zhí)行的任務(wù),所以,在規(guī)范中有這樣一句話(huà):“Task queues are sets, not queues(翻譯為任務(wù)隊(duì)列是一個(gè)集合,不是隊(duì)列)”。

任務(wù)隊(duì)列的 任務(wù)源 主要包括以下這些:

  • DOM 操作:對(duì) DOM 操作產(chǎn)生的任務(wù),例如,將元素插入文檔時(shí)以非阻塞方式發(fā)生的事情 document.body = aNewBodyElement;。
  • 用戶(hù)交互:用戶(hù)交互產(chǎn)生的任務(wù),例如鼠標(biāo)點(diǎn)擊、移動(dòng)產(chǎn)生的 Callback 任務(wù)。
  • 網(wǎng)絡(luò):網(wǎng)絡(luò)請(qǐng)求產(chǎn)生的任務(wù),例如 fetch()。
  • 歷史遍歷:此任務(wù)源用于對(duì) history.back() 和類(lèi)似 API 的調(diào)用進(jìn)行排隊(duì)。
  • **setTimeout、setInterval:**定時(shí)器相關(guān)任務(wù)。

例如,當(dāng) User agent 有一個(gè)管理鼠標(biāo)和鍵盤(pán)事件的任務(wù)隊(duì)列和另一個(gè)其它任務(wù)源相關(guān)的任務(wù)隊(duì)列,在事件循環(huán)中相比其它任務(wù),它會(huì)多出四分之三的時(shí)間來(lái)優(yōu)先執(zhí)行鼠標(biāo)和鍵盤(pán)事件的任務(wù)隊(duì)列,這樣使得其它任務(wù)源的任務(wù)隊(duì)列在能夠得到處理的情況下用戶(hù)交互相關(guān)的任務(wù)可以得到更高優(yōu)先級(jí)的處理,這也是提高了用戶(hù)的體驗(yàn)。

Microtask

每個(gè)事件循環(huán)有一個(gè)微任務(wù)隊(duì)列,它不是一個(gè) task queue,兩者是獨(dú)立的隊(duì)列。

什么是 Microtask(微任務(wù))

微任務(wù)是一個(gè)簡(jiǎn)短的函數(shù),當(dāng)創(chuàng)建該函數(shù)的函數(shù)執(zhí)行后,并且 JavaScript 執(zhí)行上下文棧為空,而控制權(quán)尚未交還給事件循環(huán)之前觸發(fā)。

當(dāng)我們?cè)谝粋€(gè)微任務(wù)里通過(guò) queueMicrotask(callback) 繼續(xù)向微任務(wù)隊(duì)列中創(chuàng)建更多的任務(wù),對(duì)于事件循環(huán)來(lái)說(shuō),它仍會(huì)持續(xù)調(diào)用微任務(wù)直至隊(duì)列為空。

  1. const log = console.log; 
  2. let i = 0; 
  3. log('sync run start'); 
  4. runMicrotask(); 
  5. log('sync run end'); 
  6.  
  7. function runMicrotask() { 
  8.   queueMicrotask(() => { 
  9.     log("microtask run, i = ", i++); 
  10.     if (i > 10) return;  
  11.     runMicrotask(); 
  12.   }); 

上面這段代碼很簡(jiǎn)單,在主線(xiàn)程調(diào)用了 runMicrotask() 函數(shù),該函數(shù)內(nèi)部使用 queueMicrotask() 創(chuàng)建了微任務(wù)并且遞歸調(diào)用,微任務(wù)的觸發(fā)是在執(zhí)行棧為空時(shí)才執(zhí)行,因?yàn)槔锩孢f歸調(diào)用每次都會(huì)生成新的微任務(wù),事件循環(huán)也是在微任務(wù)執(zhí)行完畢才執(zhí)行 Task Queue 里面的 setTimeout 回調(diào)。

  1. sync run start 
  2. sync run end 
  3. microtask run, i = 0 
  4. microtask run, i = 1 
  5. microtask run, i = 2 
  6. microtask run, i = 3 
  7. microtask run, i = 4 
  8. microtask run, i = 5 
  9. microtask run, i = 6 
  10. microtask run, i = 7 
  11. microtask run, i = 8 
  12. microtask run, i = 9 
  13. microtask run, i = 10 

通過(guò)這個(gè)示例,也可看到當(dāng)調(diào)度大量的微任務(wù)也會(huì)導(dǎo)致和同步任務(wù)相同的性能缺陷,后面的任務(wù)得不到執(zhí)行,瀏覽器的渲染工作也會(huì)被阻止。微任務(wù)這里的隊(duì)列才是真正的隊(duì)列。

創(chuàng)建一個(gè) Microtask(Promise VS queueMicrotask)

在以往我們創(chuàng)建一個(gè)微任務(wù)很簡(jiǎn)單,可以創(chuàng)建一個(gè)立即 resolve 的 Promise,每次都需要?jiǎng)?chuàng)建一個(gè) Promise 實(shí)例,同時(shí)也帶來(lái)了額外的內(nèi)存開(kāi)銷(xiāo),另外 Promise 中拋出的錯(cuò)誤是一個(gè)非標(biāo)準(zhǔn)的 Error,如果未正常捕獲通常會(huì)得到這樣一個(gè)錯(cuò)誤 UnhandledPromiseRejectionWarning:。

使用 Promise 創(chuàng)建一個(gè)微任務(wù)。

  1. const p = new Promise((resolve, reject) => { 
  2.   // reject('err'
  3.   resolve(1); 
  4. }); 
  5. p.then(() => { 
  6.   log('Promise microtask.'
  7. }); 

現(xiàn)在 Window 對(duì)象上提供了 queueMicrotask() 方法以一種標(biāo)準(zhǔn)的方式,可以安全的引入微任務(wù),而無(wú)需使用額外的技巧,它提供了一種標(biāo)準(zhǔn)的異常。

使用 queueMicrotask() 創(chuàng)建一個(gè)微任務(wù)。

  1. queueMicrotask(() => { 
  2.   log('queueMicrotask.'); 
  3. }); 

在我們寫(xiě)業(yè)務(wù)功能時(shí),一個(gè)功能或方法內(nèi)涉及多個(gè)異步調(diào)度的任務(wù)也是很常見(jiàn)的,基于 Promise 我們很熟悉,還可以使用 Async/Await 以一種同步線(xiàn)性的思維來(lái)書(shū)寫(xiě)代碼。而 queueMicrotask 需要傳遞一個(gè)回調(diào)函數(shù),當(dāng)層級(jí)多了很容易出現(xiàn)嵌套。

重點(diǎn)是大多數(shù)情況下我們也不需要去創(chuàng)建微任務(wù),過(guò)多的濫用也會(huì)造成性能問(wèn)題,也許在做一些類(lèi)似創(chuàng)建框架或庫(kù)時(shí)可能需要借助微任務(wù)來(lái)達(dá)到某些功能。這里我想到了一個(gè)經(jīng)常問(wèn)的面試題 “實(shí)現(xiàn)一個(gè) Promise” 這個(gè)在實(shí)現(xiàn)時(shí)也許可以采用 queueMicrotask(),在《JavaScript 異步編程》的源碼系列,會(huì)再看到這個(gè)問(wèn)題。

Microtask 總結(jié)

Microtask 總結(jié)一句話(huà)來(lái)講就是:“它是在當(dāng)前執(zhí)行棧尾部下一次事件循環(huán)前執(zhí)行”,需要注意的是,事件循環(huán)在處理微任務(wù)時(shí),如果微任務(wù)隊(duì)列不為空,就會(huì)繼續(xù)執(zhí)行微任務(wù),例如,使用遞歸不停的增加新的微任務(wù),這就很糟糕了。

微任務(wù)所包含的任務(wù)源沒(méi)有明確的定義,通常包括這幾個(gè):Promise.then()、Object.observe(已廢棄)、MutaionObserver、queueMicrotask。

更新渲染

渲染是事件循環(huán)中另一個(gè)很重要的階段,這里有一個(gè)關(guān)于 瀏覽器工作原理 的講解很好,整個(gè)渲染過(guò)程,理解下來(lái)主要是下面幾個(gè)步驟,其中 Layout、 **Paint **這些詞在下面的示例還會(huì)再次看到。

  • 解析 HTML 文檔轉(zhuǎn)化為 DOM Tree,同時(shí)也會(huì)解析外部 CSS 文件及內(nèi)嵌的 CSS 樣式為 CSSOM Tree。
  • DOM Tree、CSSOM Tree 兩者的結(jié)合創(chuàng)建出另外一個(gè)樹(shù)結(jié)構(gòu) Render Tree。
  • Render Tree 完畢之后進(jìn)入布局(Layout)階段,為每個(gè)節(jié)點(diǎn)分配一個(gè)在屏幕上的坐標(biāo)位置。
  • 接下來(lái)根據(jù)節(jié)點(diǎn)坐標(biāo)位置對(duì)整個(gè)頁(yè)面繪制(Paint)。
  • 當(dāng)我們對(duì) DOM 元素修改之后,例如元素顏色改變、添加 DOM 節(jié)點(diǎn),這時(shí)也還會(huì)觸發(fā)布局和重繪(Repaint)。

圖片來(lái)源:https://www.html5rocks.com/zh/tutorials/internals/howbrowserswork/webkitflow.png

結(jié)合 Task 與 Microtask 看渲染過(guò)程

做一個(gè)測(cè)試,使用 queueMicrotask 創(chuàng)建一個(gè)微任務(wù),在自定義的 runMicrotask() 函數(shù)內(nèi)部遞歸調(diào)用了 10 次,每一次里我都希望來(lái)回變換 container 這個(gè) div 的背景色,另外還放置了一個(gè) setTimeout 屬于 Task queue 這個(gè)是讓大家順便看下 Task queue 在事件循環(huán)中的執(zhí)行順序

  1. <div id="container" style="width: 200px; height: 200px; background-color: red; font-size: 100px; color: #fff;"
  2.   0 
  3. </div> 
  4. <script> 
  5.   let i = 0; 
  6.   const container = document.getElementById('container'); 
  7.   setTimeout(() => {}); 
  8.   runMicrotask(); 
  9.   function runMicrotask() { 
  10.     queueMicrotask(() => { 
  11.       if (i > 10) return;  
  12.       container.innerText = i; 
  13.       container.style.backgroundColor = i % 2 === 0 ? 'blue' : 'red'
  14.       runMicrotask(); 
  15.     }); 
  16.   } 
  17. </script> 

通過(guò) Chrome 的 Performance 記錄,運(yùn)行過(guò)程,首先看下 Frame 只有一個(gè),直接渲染出了最后的結(jié)果,如果按照上例,我們可能會(huì)覺(jué)得應(yīng)該是在每個(gè)微任務(wù)執(zhí)行時(shí)都會(huì)有一次渲染 blue -> red -> blue -> ...

再看一個(gè)更詳細(xì)的執(zhí)行過(guò)程,可以看到在執(zhí)行腳步執(zhí)行后,首先運(yùn)行的是微任務(wù),對(duì)應(yīng)的是我們代碼 runMicrotask() 函數(shù),下圖紫色的是 Layout,Paint 是渲染繪制能夠看到就是在運(yùn)行完所有的微任務(wù)之后執(zhí)行的,在之后是下一次事件循環(huán)最后執(zhí)行了 Task Queue Timer。

根據(jù)事件循環(huán)處理模式規(guī)范中的描述,渲染是在一次事件循環(huán)的微任務(wù)結(jié)束之后運(yùn)行,上例差不多驗(yàn)證了這個(gè)結(jié)果,這個(gè)時(shí)候有個(gè)疑問(wèn):“為什么不是在每一次微任務(wù)結(jié)束之后執(zhí)行,當(dāng)你把 queueMicrotask 替換成 setTimeout 也是一樣的,不會(huì)在每次事件中都去執(zhí)行”。

Render 在事件循環(huán)中什么時(shí)候執(zhí)行?

規(guī)范中還有這樣一段描述,得到一個(gè)信息是:在每一次的事件循環(huán)結(jié)束后不一定會(huì)執(zhí)行渲染。

每一輪的事件循環(huán)如果沒(méi)有阻塞操作,這個(gè)時(shí)間是很快的,考慮到硬件刷新頻率限制和性能原因的 user agent 節(jié)流,瀏覽器的更新渲染不會(huì)在每次事件循環(huán)中被觸發(fā)。如果瀏覽器試圖達(dá)到每秒 60Hz 的刷新率,也簡(jiǎn)稱(chēng) 60fps(60 frame per second),這時(shí)繪制一個(gè) Frame 的間隔為 16.67ms(1000/60)。如果在 16ms 內(nèi)有多次 DOM 操作,也是不會(huì)渲染多次的。

如果瀏覽器無(wú)法維持 60fps 就會(huì)降低到 30fps、4fps 甚至更低。

如果想在每次事件循環(huán)中或微任務(wù)之后執(zhí)行一次繪制,可以通過(guò) requestAnimationFrame 重新渲染。

結(jié)合 requestAnimationFrame 再看渲染過(guò)程

requestAnimationFrame 是瀏覽器 window 對(duì)象下提供的一個(gè) API,它的應(yīng)用場(chǎng)景是告訴瀏覽器,我需要運(yùn)行一個(gè)動(dòng)畫(huà)。該方法會(huì)要求瀏覽器在下次重繪之前調(diào)用指定的回調(diào)函數(shù)更新動(dòng)畫(huà)。

修改上述示例,加上 requestAnimationFrame() 方法。

  1. function runMicrotask() { 
  2.     queueMicrotask(() => { 
  3.       requestAnimationFrame(() => { 
  4.         if (i > 10) return;  
  5.         container.innerText = i; 
  6.         container.style.backgroundColor = i % 2 === 0 ? 'blue' : 'red'
  7.         i++; 
  8.         runMicrotask(); 
  9.       }); 
  10.     }); 
  11.   } 

運(yùn)行之后如下所示,每一次的元素改變都得到了重新繪制。

放大其中一個(gè)看看任務(wù)的執(zhí)行情況,requestAnimationFrame 也可以看作一個(gè)任務(wù),可以看到它在運(yùn)行之后執(zhí)行微任務(wù)。

Render 總結(jié)

事件循環(huán)中 Render 階段可能在一次事件循環(huán)中運(yùn)行,也可能在多次事件循環(huán)后運(yùn)行。它會(huì)受到瀏覽器的刷新頻率影響,如果是 60fps 那就是每間隔 16.67ms 執(zhí)行一次,另一方面當(dāng)瀏覽器認(rèn)為更新渲染對(duì)用戶(hù)沒(méi)有影響的情況下,也會(huì)認(rèn)為這不是一次必要的渲染。

總的來(lái)說(shuō)它的機(jī)制和瀏覽器是相關(guān)的,了解即可,不用特別的糾結(jié)。

總結(jié)

瀏覽器中事件循環(huán)主要由 Task、Microtask、Render 三個(gè)階段組成,Task、Microtask 是我們會(huì)用到的比較多的,無(wú)論是網(wǎng)絡(luò)請(qǐng)求、還是 DOM 操作、Promise 這些大致都劃分為這兩類(lèi)任務(wù),每一輪的事件循環(huán)都會(huì)檢查這兩個(gè)任務(wù)隊(duì)列里是否有要執(zhí)行的任務(wù),等 JavaScript 上下文棧空后,先情況微任務(wù)隊(duì)列里的所有任務(wù),之后在執(zhí)行宏任務(wù),而 Render 則不是必須的,它受瀏覽器的一些因素影響,并不一定在每次事件循環(huán)中執(zhí)行。

Reference

https://yu-jack.github.io/2020/02/03/javascript-runtime-event-loop-browser/

https://www.html5rocks.com/zh/tutorials/internals/howbrowserswork/

https://html.spec.whatwg.org/multipage/webappapis.html#event-loops

 

https://zhuanlan.zhihu.com/p/34229323

 

責(zé)任編輯:武曉燕 來(lái)源: 編程界
相關(guān)推薦

2021-10-22 08:29:14

JavaScript事件循環(huán)

2017-01-05 09:07:25

JavaScript瀏覽器驅(qū)動(dòng)

2015-04-22 10:50:18

JavascriptJavascript異

2014-05-23 10:12:20

Javascript異步編程

2016-10-09 08:38:01

JavaScript瀏覽器事件

2021-12-08 07:55:41

EventLoop瀏覽器事件

2017-02-09 15:15:54

Chrome瀏覽器

2020-12-23 07:37:17

瀏覽器HTML DOM0

2019-12-17 14:45:17

瀏覽器事件循環(huán)前端

2023-04-28 15:20:37

JavaScript事件循環(huán)

2024-06-04 15:56:48

Task?.NET異步編程

2013-03-08 09:33:25

JavaScript同步異步

2021-06-10 07:51:07

Node.js循環(huán)機(jī)制

2017-04-26 14:15:35

瀏覽器緩存機(jī)制

2021-06-06 19:51:07

JavaScript異步編程

2017-05-15 13:40:20

瀏覽器http緩存機(jī)制

2022-07-07 07:22:01

瀏覽器JavaScript工具

2013-04-01 15:25:41

異步編程異步EMP

2020-03-12 11:29:51

JavaScript瀏覽器語(yǔ)言

2022-04-29 09:11:14

CORS瀏覽器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

26uuu成人网一区二区三区| 中文字幕永久免费| 伊人影院综合网| 丁香花在线观看完整版电影| 国产精品嫩草影院在线看| 中文字幕一区在线观看| 日本欧美国产在线| 成人在线观看你懂的| 91好色先生tv| 精品国产精品久久一区免费式| 亚洲国产视频一区二区| 538国产精品一区二区免费视频| 欧美性受xxxxxx黑人xyx性爽| 国产一二在线观看| 亚洲自啪免费| 日韩经典一区二区三区| av女优在线播放| 丰满肥臀噗嗤啊x99av| 中文字幕av亚洲精品一部二部| 欧美视频一区在线| 色综合影院在线观看| 亚洲国产成人精品女人久久| 日日天天久久| 第一福利永久视频精品| 精品国产乱码久久久久| 国产精品第108页| 国产在线播放精品| 午夜电影一区二区| 九九九九精品九九九九| 欧美国产精品一二三| 国产不卡精品在线| 玉米视频成人免费看| 91传媒在线免费观看| 免费一级肉体全黄毛片| 成人中文字幕视频| 婷婷开心激情综合| 日韩高清dvd| 96亚洲精品久久久蜜桃| 久久xxxx精品视频| 一区二区三区黄色| 超碰人人草人人| 日日夜夜天天综合入口| 99久久er热在这里只有精品66| 日本电影亚洲天堂| 秋霞欧美一区二区三区视频免费| 电影一区中文字幕| 欧美日韩性生活| 粉嫩av一区二区三区天美传媒| 高清一区二区三区四区| 国产最新精品免费| 久久久天堂国产精品女人| 91丨porny丨对白| 亚洲伦理影院| 亚洲乱码一区二区三区在线观看| 国产亚洲二区| 这里只有精品免费视频| 日本大胆欧美| 欧美成人a视频| 国产成人精品视频ⅴa片软件竹菊| av在线三区| 国产98色在线|日韩| 69久久夜色精品国产69| 国产黄色录像视频| 成人3d精品动漫精品一二三| 亚洲欧美日韩国产精品| 91精产国品一二三产区别沈先生| 欧美成人app| 亚洲专区一二三| 日韩欧美亚洲精品| 成人性生交大片免费看午夜 | 中文字幕一区二区三区乱码不卡| 国产精品极品国产中出| 欧美精品一区二区久久婷婷| 无码aⅴ精品一区二区三区浪潮| h视频在线观看免费| 国产日韩欧美a| 国产精品一区二区欧美黑人喷潮水 | 亚洲欧洲精品一区二区三区| 99久久精品久久久久久ai换脸| 免费黄色网址在线| 欧美成人国产| 中文字幕日韩欧美| 日本护士做爰视频| 久久视频免费| 欧美精品久久一区二区三区| 我的公把我弄高潮了视频| 嗯啊主人调教在线播放视频| 亚洲丝袜精品丝袜在线| 少妇特黄a一区二区三区| 色的视频在线免费看| 久久久.com| 精品一区二区三区日本| 成人精品福利| 亚洲最新在线观看| 麻豆传传媒久久久爱| 蜜桃视频m3u8在线观看| 亚洲国产视频a| 99免费视频观看| 在线精品国产亚洲| 欧美一级在线免费| 三级av免费观看| 亚洲天堂一区二区| 色婷婷综合久久久中文一区二区| 高清无码视频直接看| 快射视频在线观看| 国产精品久久久久久久久久久免费看 | 高清亚洲成在人网站天堂| 无码人妻精品一区二区50| 国产精品一区二区免费不卡| 国产精品成人av在线| 午夜精品久久久久久久久久久久久蜜桃| 在线看片不卡| 国产91露脸中文字幕在线| 精品人妻无码一区二区三区蜜桃一| 麻豆精品国产91久久久久久| 国产乱肥老妇国产一区二| 这里只有精品免费视频| 不卡大黄网站免费看| 国产精品日韩一区二区 | 国产精品调教视频| 精品国产一区av| 免费一级特黄3大片视频| 国内在线观看一区二区三区| 欧美激情视频在线观看| 91香蕉视频污在线观看| 日韩精品久久| 久久久99久久精品女同性| 日韩三级久久久| 99久久亚洲精品蜜臀| 久久大大胆人体| 黄色激情小视频| 亚洲国产精品日韩专区av有中文| 欧美日本高清一区| 国产精品老女人| 国产美女视频一区| 国产伦精品一区二区三区| 国产视频中文字幕在线观看| 欧美日韩视频在线第一区| 日韩网站在线播放| 成人羞羞网站入口| 日本成人激情视频| 精品乱码一区二区三四区视频 | 中文字幕亚洲一区| 黄色污污视频软件| 精品一区二区三区蜜桃| 成人国产1314www色视频| 成人在线观看亚洲| 狠狠躁夜夜躁人人爽天天天天97| 精品国产午夜福利在线观看| 欧美绝顶高潮抽搐喷水合集| 亚洲无线码在线一区观看| www.av成人| 国产综合婷婷| 国产成人精品免费视频大全最热 | 中文欧美在线视频| 中国一级特黄视频| 综合中文字幕亚洲| 一级全黄裸体片| 亚洲国产日韩欧美一区二区三区| 日本最新高清不卡中文字幕| 天堂а√在线8种子蜜桃视频| 国产精品日产欧美久久久久| 久久久久久久9| 凹凸成人在线| 日韩av成人在线观看| 国产香蕉视频在线看| 一二三区精品视频| 精品无码人妻少妇久久久久久| 在线成人亚洲| 91精品国产综合久久男男| 人妻中文字幕一区| 国产精品久久久久久久久动漫| 91av视频免费观看| 国产真实久久| 日本欧美色综合网站免费| 亚洲国产精品精华素| 精品第一国产综合精品aⅴ| 日韩精品久久久久久久酒店| 国内成+人亚洲+欧美+综合在线| 99亚洲国产精品| 久久综合五月婷婷| 欧美大尺度激情区在线播放| 欧美一区二区黄片| 91国偷自产一区二区三区成为亚洲经典| 农村末发育av片一区二区| 日韩视频在线一区二区三区| 亚洲综合日韩中文字幕v在线| 国产午夜在线视频| 91精品国产欧美一区二区| 日本三级片在线观看| 国产美女在线观看一区| 国产免费黄色一级片| 日本一区二区在线看| 高清日韩一区| 91天天综合| 亚洲区一区二区| 中文字幕在线观看视频网站| 欧美激情一区在线观看| 国产美女三级视频| 久久久久亚洲| 日本一区二区精品| 97色成人综合网站| 国产一区视频在线| 日韩伦理在线一区| 久久亚洲精品网站| 黄色av网站在线免费观看| 日韩精品一区二区三区视频在线观看| 在线观看美女av| 久久久777精品电影网影网| 欧美丰满熟妇bbb久久久| 欧美成人69av| 五月婷婷综合色| 久久动漫网址| 99电影网电视剧在线观看| 成人性片免费| 欧美劲爆第一页| 国产剧情在线| 搡老女人一区二区三区视频tv| 欧美 亚洲 另类 激情 另类 | 人人干人人干人人干| 亚洲欧洲另类国产综合| 久久精品国产亚洲av久| 久久成人在线| 欧美日韩福利在线| 日本午夜精品| www.成人av| 国产精品久久免费视频| 国产精品极品美女在线观看免费| 欧美调教sm| 性色av一区二区三区在线观看| 无码国精品一区二区免费蜜桃| 午夜免费久久看| 欧美在线视频第一页| 中文字幕av资源一区| 亚洲精品乱码久久久久久动漫| 欧美日韩国产探花| 国模一区二区三区私拍视频| 伊人久久影院| 国产成人免费观看| 99国产精品免费网站| 亚洲自拍偷拍福利| 国产精品久久久久久久久久辛辛| 国产一区私人高清影院| 五月天色综合| 性欧美办公室18xxxxhd| 国产三级伦理在线| 久久久久久伊人| av手机在线观看| 一本色道久久88亚洲综合88| 欧美一区二区视频| 欧美疯狂性受xxxxx喷水图片| 中文字幕 国产| 欧美三级欧美一级| 一本到在线视频| 精品久久久久久久大神国产| 亚洲国产精品午夜在线观看| 性做久久久久久| www.国产高清| 在线观看欧美黄色| 国产午夜免费视频| 亚洲va欧美va人人爽午夜| 日韩美女一级片| 一区二区三区四区五区在线| 日韩欧中文字幕| 久久一二三四区| 久久久99精品免费观看不卡| 国产免费无遮挡吸奶头视频| 国产99久久精品| 美女久久久久久久久| 91香蕉视频在线| 欧美丰满老妇熟乱xxxxyyy| 成人免费视频网站在线观看| 国产又黄又猛又粗| 国产日韩欧美| 国产 欧美 日本| 91日韩欧美| 无码免费一区二区三区免费播放| 视频在线不卡免费观看| 400部精品国偷自产在线观看| 禁果av一区二区三区| 麻豆传媒一区二区| 国产精品欧美大片| 日韩伦理一区二区三区av在线| 999视频精品| 日韩日韩日韩日韩日韩| 老**午夜毛片一区二区三区| 亚洲国产精品无码观看久久| 久热re这里精品视频在线6| 91福利免费观看| 99视频精品免费视频| 在线播放第一页| 久久久精品免费网站| 在线看的片片片免费| 精品毛片网大全| 国产精品久久久久精| 欧美体内she精视频| 精品美女www爽爽爽视频| 亚洲区免费影片| 国产深夜视频在线观看| 国产精品视频一区国模私拍| 性欧美1819sex性高清| 91久久中文字幕| 超碰国产精品一区二页| 国产日韩欧美另类| 任你躁在线精品免费| 黄色网zhan| 日本系列欧美系列| 中文字幕 91| av网站免费线看精品| 亚洲一级二级片| 色拍拍在线精品视频8848| 亚洲国产精品欧美久久| 精品人伦一区二区色婷婷| 国产日本在线视频| 欧美一级视频一区二区| 亚洲大奶少妇| 精品一区国产| 欧美涩涩视频| 亚洲色图偷拍视频| 国产日韩一级二级三级| 日韩久久久久久久久| 欧美变态凌虐bdsm| 精品视频在线一区二区| 国产精品白丝jk喷水视频一区| 日韩大片在线免费观看| 999久久欧美人妻一区二区| 国产自产视频一区二区三区| 中文字幕第二区| 欧美在线你懂得| 黄色在线播放| 国产国语videosex另类| 国产91亚洲精品久久久| 日本一区视频在线观看免费| 国产精品毛片| 国产熟妇搡bbbb搡bbbb| 国产精品久久久久三级| 蜜臀精品一区二区三区| 日韩国产高清视频在线| 日韩影院在线| 欧美lavv| 日韩精品成人一区二区三区| 污污的视频免费| 中文av一区二区| 波多野结衣电影在线播放| 亚洲色图美腿丝袜| 亚洲成人人体| 亚洲精品美女久久7777777| 狠狠干成人综合网| 亚洲国产欧美日韩在线| 久久综合久久综合久久| 日本爱爱小视频| 欧美久久一区二区| 大地资源网3页在线观看| 91免费看片在线| 欧美私人啪啪vps| 95视频在线观看| 欧美日韩激情视频8区| 日韩国产福利| 国产精品美女久久久久av超清| 色综合色综合| 波多野结衣免费观看| 亚洲一区二区美女| 香蕉视频黄色片| 国产精品日韩精品| 亚洲天堂免费| 精品无码国产一区二区三区51安| 狠狠综合久久av一区二区小说| 国产系列电影在线播放网址| 成人激情在线观看| 精品久久中文| 三级性生活视频| 亚洲成人动漫一区| 免费在线看v| 欧美怡红院视频一区二区三区| 九九热爱视频精品视频| 国产精品久久久久久久久电影网| 成人深夜视频在线观看| 国产亚洲欧美在线精品| 亚洲第一中文字幕在线观看| 最爽无遮挡行房视频在线| 国产精品久久久亚洲| 亚洲91视频| 久久国产精品影院| 欧美一区二区三区性视频| 国产99在线| 一区二区在线中文字幕电影视频| 午夜亚洲视频| 人与动物性xxxx| 亚洲аv电影天堂网| 欧美性生活一级| 免费一级特黄特色毛片久久看| 久久久久国产精品麻豆| 999av视频| 欧美精品亚州精品| 国产99久久久国产精品成人免费 | 成人免费黄色| 日本a在线免费观看| 国产精品国产三级国产三级人妇| 日本免费一区视频| 成人在线播放av|