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

從一道Promise執(zhí)行順序的題目看Promise實現(xiàn)

開發(fā) 開發(fā)工具
當(dāng)然我們不只是為了解答一道題,主要還是借此了解Promise的內(nèi)部機(jī)制。讀者如果有時間有興趣可以自行分析,然后再回過頭來比較一下本文的分析。或者你可以跟著下面的思路,操起鼠標(biāo)和鍵盤和我一起干。

之前在網(wǎng)上看到一道Promise執(zhí)行順序的題目——打印以下程序的輸出:

  1. new Promise(resolve => { 
  2.     console.log(1); 
  3.     resolve(3); 
  4. }).then(num => { 
  5.     console.log(num) 
  6. }); 
  7. console.log(2) 

這道題的輸出是123,為什么不是132呢?因為我一直理解Promise是沒有異步功能,它只是幫忙解決異步回調(diào)的問題,實質(zhì)上是和回調(diào)是一樣的,所以如果按照這個想法,resolve之后應(yīng)該會立刻then。但實際上并不是。難道用了setTimeout?

如果在promise里面再加一個promise:

  1. new Promise(resolve => { 
  2.     console.log(1); 
  3.     resolve(3); 
  4.     Promise.resolve().then(()=> console.log(4)) 
  5. }).then(num => { 
  6.     console.log(num) 
  7. }); 
  8. console.log(2) 

執(zhí)行順序是1243,第二個Promise的順序會比***個的早,所以直觀來看也是比較奇怪,這是為什么呢?

Promise的實現(xiàn)有很多庫,有jQuery的deferred,還有很多提供polyfill的,如es6-promise,lie等,它們的實現(xiàn)都基于Promise/A+標(biāo)準(zhǔn),這也是ES6的Promise采用的。

[[222353]]

為了回答上面題目的執(zhí)行順序問題,必須得理解Promise是怎么實現(xiàn)的,所以得看那些庫是怎么實現(xiàn)的,特別是我錯誤地認(rèn)為不存在的Promise的異步是怎么實現(xiàn)的,因為***一行的console.log(2)它并不是***執(zhí)行的,那么必定有某些類似于setTimeout的異步機(jī)制讓上面同步的代碼在異步執(zhí)行,所以它才能在代碼執(zhí)行完了之后才執(zhí)行。

當(dāng)然我們不只是為了解答一道題,主要還是借此了解Promise的內(nèi)部機(jī)制。讀者如果有時間有興趣可以自行分析,然后再回過頭來比較一下本文的分析。或者你可以跟著下面的思路,操起鼠標(biāo)和鍵盤和我一起干。

這里使用lie的庫,相對于es6-promise來說代碼更容易看懂,先npm install一下:

  1. npm install lie 

讓代碼在瀏覽器端運行,準(zhǔn)備以下html:

  1. <!DOCType html> 
  2. <html> 
  3. <head> 
  4.     <meta charset="utf-8"
  5. </head> 
  6. <body> 
  7.     <script src="node_modules/lie/dist/lie.js"></script> 
  8.     <script src="index.js"></script> 
  9. </body> 
  10. </html> 

其中index.js的內(nèi)容為:

  1. console.log(Promise); 
  2. new Promise(resolve => { 
  3.     console.log(1); 
  4.     resolve(3); 
  5.     Promise.resolve().then(()=> console.log(4)) 
  6. }).then(num => { 
  7.     console.log(num) 
  8. }); 
  9. console.log(2); 

把Promise打印一下,確認(rèn)已經(jīng)把原生的那個覆蓋了,對比如下:

因為原生的Promise我們是打不了斷點的,所以才需要借助一個第三方的庫。

我們在第4行的resolve(3)那里打個斷點進(jìn)去看一下resolve是怎么執(zhí)行的,層層進(jìn)去,***的函數(shù)是這個:

我們發(fā)現(xiàn),這個函數(shù)好像沒干啥,它就是設(shè)置了下self的state狀態(tài)為FULFILLED(完成),并且把結(jié)果outcome設(shè)置為調(diào)resolve傳進(jìn)來的值,這里是3,如果resolve傳來是一個Promise的話就會進(jìn)入到上圖187行的Promise鏈處理,這里我們不考慮這種情況。這里的self是指向一個Promise對象:

它主要有3個屬性——outcome、queue、state,其中outcome是resolve傳進(jìn)來的結(jié)果,state是Promise的狀態(tài),在第83行的代碼可以查到Promise的狀態(tài)總共有3種:

  1. var REJECTED = ['REJECTED']; 
  2. var FULFILLED = ['FULFILLED']; 
  3. var PENDING = ['PENDING']; 

Rejected失敗,fulfilled成功,pending還在處理中,在緊接著89行的Promise的構(gòu)造函數(shù)可以看到,state初始化的狀態(tài)為pending:

  1. function Promise(resolver) { 
  2.   if (typeof resolver !== 'function') { 
  3.     throw new TypeError('resolver must be a function'); 
  4.   } 
  5.   this.state = PENDING; 
  6.   this.queue = []; 
  7.   this.outcome = void 0; 
  8.   if (resolver !== INTERNAL) { 
  9.     safelyResolveThenable(this, resolver); 
  10.   } 

并且在右邊的調(diào)用棧可以看到,resolver是由Promise的構(gòu)造函數(shù)觸發(fā)執(zhí)行的,即當(dāng)你new Promise的時候就會執(zhí)行傳參的函數(shù),如下圖所示:

傳進(jìn)來的函數(shù)支持兩個參數(shù),分別是resolve和reject回調(diào):

傳進(jìn)來的函數(shù)支持兩個參數(shù),分別是resolve和reject回調(diào):

  1. let resolver = function(resolve, reject) { 
  2.     if (success) resolve(); 
  3.     else reject(); 
  4. }; 
  5.   
  6. new Promise(resolver); 

這兩個函數(shù)是Promise內(nèi)部定義,但是要在你的函數(shù)里調(diào)一下它的函數(shù),告訴它什么時候成功了,什么時候失敗了,這樣它才能繼續(xù)下一步的操作。所以這兩個函數(shù)參數(shù)是傳進(jìn)來的,它們是Promise的回調(diào)函數(shù)。Promise是怎么定義和傳遞這兩個函數(shù)的呢?還是在剛剛那個斷點的位置,但是我們改變一下右邊調(diào)用棧顯示的位置:

上圖執(zhí)行的thenable函數(shù)就是我們傳給它的resolver,然后傳遞onSuccess和onError,分別是我們在resolver里面寫的resolve和reject這兩個參數(shù)。如果我們調(diào)了它的resolve即onSuccess函數(shù),它就會調(diào)236行的handlers.resolve就到了我們***次打斷點的那張圖,這里再放一次:

然后去設(shè)置當(dāng)前Promise對象的state,outcome等屬性。這里沒有進(jìn)入到193行的while循環(huán)里,因為queue是空的。這個地方下文會繼續(xù)提到。

接著,我們在then那里打個斷點進(jìn)去看一下:

then又做了些什么工作呢?如下圖所示:

then可以傳兩個參數(shù),分別為成功回調(diào)和失敗回調(diào)。我們給它傳了一個成功回調(diào),即上圖劃線的地方。并且由于在resolver里面已經(jīng)把state置成fulfilled完成態(tài)了,所以它會執(zhí)行unwrap函數(shù),并傳遞成功回調(diào)、以及resolve給的結(jié)果outcome(還有一個參數(shù)promise,主要是用于返回,形成then鏈)。

unwrap函數(shù)是這樣實現(xiàn)的:

在167行執(zhí)行then里傳給Promise的成功回調(diào),并傳遞結(jié)果outcome。

這段代碼是包在一個immediate函數(shù)里的,這里就是解決Promise異步問題的關(guān)鍵了。并且我們在node_modules目錄里面,也發(fā)現(xiàn)了lie使用了immediate庫,它可以實現(xiàn)一個nextTick的功能,即在當(dāng)前代碼邏輯單元同步執(zhí)行完了之后立刻執(zhí)行,相當(dāng)于setTimeout 0,但是它又不是直接用setTimeout 0實現(xiàn)的。

我們重點來看一下它是怎么實現(xiàn)一個nextTick的功能的。immediate里面會調(diào)一個scheduleDrain(drain是排水的意思):

  1. function immediate(task) { 
  2.   // 這個判斷先忽略 
  3.   if (queue.push(task) === 1 && !draining) { 
  4.     scheduleDrain(); 
  5.   } 

實現(xiàn)邏輯在這個scheduleDrain,它是這么實現(xiàn)的:

  1. var Mutation = global.MutationObserver || global.WebKitMutationObserver; 
  2. var scheduleDrain = null
  3.   // 瀏覽器環(huán)境,IE11以上支持 
  4.   if (Mutation) { 
  5.       // ... 
  6.   }  
  7.   // Node.js環(huán)境 
  8.   else if (!global.setImmediate && typeof global.MessageChannel !== 'undefined'
  9.   
  10.   } 
  11.   // 低瀏覽器版本解決方案 
  12.   else if ('document' in global && 'onreadystatechange' in global.document.createElement('script')) { 
  13.   
  14.   } 
  15.   // ***實在沒辦法了,用最次的setTimeout 
  16.   else { 
  17.     scheduleDrain = function () { 
  18.       setTimeout(nextTick, 0); 
  19.     }; 
  20.   } 

它會有一個兼容性判斷,優(yōu)先使用MutationObserver,然后是使用script標(biāo)簽的方式,這種到IE6都支持,***啥都不行就用setTimeout 0.

我們主要看一下Mutation的方式是怎么實現(xiàn)的,MDN上有介紹這個MutationObserver的用法,可以用它來監(jiān)聽DOM結(jié)點的變化,如增刪、屬性變化等。Immediate是這么實現(xiàn)的:

  1. if (Mutation) { 
  2.     var called = 0; 
  3.     var observer = new Mutation(nextTick); 
  4.     var element = global.document.createTextNode(''); 
  5.     // 監(jiān)聽節(jié)點的data屬性的變化 
  6.     observer.observe(element, { 
  7.       characterData: true 
  8.     }); 
  9.     scheduleDrain = function () { 
  10.       // 讓data屬性發(fā)生變化,在0/1之間不斷切換, 
  11.       // 進(jìn)而觸發(fā)observer執(zhí)行nextTick函數(shù) 
  12.       element.data = (called = ++called % 2); 
  13.     }; 
  14.   } 

使用nextTick回調(diào)注冊一個observer觀察者,然后創(chuàng)建一個DOM節(jié)點element,成為observer的觀察對象,觀察它的data屬性。當(dāng)需要執(zhí)行nextTick函數(shù)的時候,就調(diào)一下scheduleDrain改變data屬性,就會觸發(fā)觀察者的回調(diào)nextTick。它是異步執(zhí)行的,在當(dāng)前代碼單元執(zhí)行完之后立刻之行,但又是在setTimeout 0之前執(zhí)行的,也就是說,以下代碼,***行的5是***輸出的:

  1. setTimeout(()=> console.log(5), 0); 
  2. new Promise(resolve => { 
  3.     console.log(1); 
  4.     resolve(3); 
  5.     // Promise.resolve().then(()=> console.log(4)) 
  6. }).then(num => { 
  7.     console.log(num) 
  8. }); 
  9. console.log(2); 

這個時候,我們就可以回答為什么上面代碼的輸出順序是123,而不是132了。***點可以肯定的是1是***輸出的,因為new一個Promise之后,傳給它的resolver同步執(zhí)行,所以1***打印。執(zhí)行了resolve(3)之后,就會把當(dāng)前Promiser對象的state改成完成態(tài),并記錄結(jié)果outcome。然后跳出來執(zhí)行then,把傳給then的成功回調(diào)給immediate在nextTick執(zhí)行,而nextTick是使用Mutation異步執(zhí)行的,所以3會在2之后輸出。

如果在promise里面再寫一個promsie的話,由于里面的promise的then要比外面的promise的then先執(zhí)行,也就是說它的nextTick更先注冊,所以4是在3之前輸出。

這樣基本上就解釋了Promise的執(zhí)行順序的問題。但是我們還沒說它的nextTick是怎么實現(xiàn)的,上面代碼在執(zhí)行immediate的時候把成功回調(diào)push到一個全局的數(shù)組queue里面,而nextTick是把這些回調(diào)按順序執(zhí)行,如下代碼所示:

  1. function nextTick() { 
  2.   draining = true
  3.   var i, oldQueue; 
  4.   var len = queue.length; 
  5.   while (len) { 
  6.     oldQueue = queue; 
  7.     // 把queue清空 
  8.     queue = []; 
  9.     i = -1; 
  10.     // 執(zhí)行當(dāng)前所有回調(diào) 
  11.     while (++i < len) { 
  12.       oldQueue[i](); 
  13.     } 
  14.     len = queue.length; 
  15.   } 
  16.   draining = false

它會先把排水的變量draining設(shè)置成true,然后處理完成之后再設(shè)置成false,我們再回顧一下剛剛執(zhí)行immediate的判斷:

  1. function immediate(task) { 
  2.   if (queue.push(task) === 1 && !draining) { 
  3.     scheduleDrain(); 
  4.   } 

由于JS是單線程的,所以我覺得這個draining的變量判斷好像沒有太大的必要。另外一個判斷,當(dāng)queue為空時,push一個變量進(jìn)來,這個時候queue只有1個元素,返回值就為1。所以如果之前已經(jīng)push過了,那么這里就不用再觸發(fā)nextTick,因為***次的push會把所有queue回調(diào)元素都執(zhí)行的,只要保證后面的操作有被push到這個queue里面就好了。所以這個判斷是一個優(yōu)化。

另外,es6-promise的核心代碼是一樣的,只是它把immediate函數(shù)改成asap(as soon as possible),它也是優(yōu)先使用Mutation.

還有一個問題,上面說的resolver的代碼是同步,但是我們經(jīng)常用Promise是用在異步的情況,resolve是異步調(diào)的,不是像上面同步調(diào)的,如:

  1. let resolver = function(resolve) { 
  2.     setTimeout(() => { 
  3.         // 異步調(diào)用resolve 
  4.         resolve(); 
  5.     }, 2000); 
  6.     // resolver執(zhí)行完了還沒執(zhí)行resolve 
  7. }; 
  8. new Promise(resolver).then(num => console.log(num)); 

這個時候,同步執(zhí)行完resolver,但還沒執(zhí)行resolve,所以在執(zhí)行then的時候這個Promise的state還是pending的,就會走到134的代碼(剛剛執(zhí)行的是132行的unwrap):

它會創(chuàng)建一個QueueItem然后放到當(dāng)前Promise對象的queue屬性里面(注意這里的queue和上面說的immediate里全局的queue是兩個不同的變量)。然后異步執(zhí)行結(jié)束調(diào)用resolve,這個時候queue不為空了:

就會執(zhí)行queue隊列里面的成功回調(diào)。因為then是可以then多次的,所以成功回調(diào)可能會有多個。它也是調(diào)用immediate,在nextTick的時候執(zhí)行的。

也就是說如果是同步resolve的,是通過MutationObserver/Setimeout 0之類的方式在當(dāng)前的代碼單元執(zhí)行完之后立刻執(zhí)行成功回調(diào);而如果是異步resolve的,是先把成功回調(diào)放到當(dāng)前Promise對象的一個隊列里面,等到異步結(jié)束了執(zhí)行resolve的時候再用同樣的方式在nextTick調(diào)用成功回調(diào)。

我們還沒說失敗的回調(diào),但大體是相似的。

【本文是51CTO專欄作者“人人網(wǎng)FED”的原創(chuàng)稿件,轉(zhuǎn)載請通過51CTO聯(lián)系原作者獲取授權(quán)】

戳這里,看該作者更多好文

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2022-01-21 08:50:15

Promise任務(wù)隊列前端

2021-04-27 08:31:37

Promisereject信息

2021-04-28 08:21:21

Promise.any服務(wù)器場景

2020-09-24 11:46:03

Promise

2023-09-15 15:31:23

異步編程Promise

2021-04-29 08:28:24

架構(gòu)參數(shù)傳遞

2017-05-11 20:20:59

JavascriptPromiseWeb

2020-07-29 17:35:08

Promise源碼前端

2012-05-18 11:17:58

Java多線程

2021-09-02 12:07:48

Swift 監(jiān)聽系統(tǒng)Promise

2021-03-09 07:37:42

技術(shù)Promise測試

2021-03-27 10:59:45

JavaScript開發(fā)代碼

2020-09-18 09:02:20

JavaScript

2021-11-10 07:47:49

Python源碼代碼

2020-12-15 08:01:24

Promise參數(shù)ES6

2021-04-29 21:06:49

有序數(shù)組算法

2018-04-26 11:23:01

Linuxfork程序

2021-04-13 08:50:21

JS作用域面試題

2015-07-23 11:59:27

JavascriptPromise

2024-03-18 13:32:11

點贊
收藏

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

女人让男人操自己视频在线观看| 欧美 日韩 国产 精品| 99精品国产一区二区三区| 欧美一区二区视频观看视频 | 免费av一区二区三区四区| 欧洲另类一二三四区| 香蕉视频在线网址| 色一情一乱一区二区三区| 日韩国产在线一| 欧美高清视频免费观看| 国产成人无码精品久久二区三| 成人在线分类| 都市激情亚洲色图| 久久精品国产精品亚洲精品色| 午夜小视频在线播放| 精品午夜一区二区三区在线观看| 欧美性视频网站| 欧美亚洲日本在线| 欧美美女一区| 精品国产1区二区| 91高清国产视频| 中文字幕21页在线看| 亚洲精品综合在线| 无遮挡亚洲一区| 亚洲日本中文字幕在线| 国产成人在线视频网址| 国产精品入口夜色视频大尺度| 天天操天天射天天爽| 久久精品亚洲人成影院| 亚洲色图综合久久| 日批在线观看视频| 国产精品视频一区视频二区| 色88888久久久久久影院野外| 久久av综合网| caoporn免费在线视频| 国产三级欧美三级| 久久人人九九| 日本人妻熟妇久久久久久| 国产一区二区剧情av在线| 国产精品高潮呻吟久久av黑人| 韩国av免费观看| 国产综合激情| 久久久久久久999| www.99re7| 91欧美国产| 综合激情国产一区| 一级黄色片网址| jlzzjlzz亚洲女人| 亚洲一级黄色av| 国产精品亚洲无码| 欧美人与物videos另类xxxxx| 亚洲精品国产精品久久清纯直播 | 久久先锋影音av| 久久久精品动漫| 日本在线视频1区| 97se亚洲国产综合自在线| 国产亚洲一区二区三区在线播放| 亚洲精品一区二区三区新线路| 国内成人自拍视频| 亚洲qvod图片区电影| 99久久免费国产精精品| 韩国av一区二区| 99re6热在线精品视频播放速度| 国产美女裸体无遮挡免费视频| 久久91精品国产91久久小草| 成人免费看片视频| 精品久久国产视频| 粉嫩久久99精品久久久久久夜| 国产手机精品在线| 日韩av地址| 欧美韩国日本一区| 97精品国产97久久久久久粉红| av官网在线播放| 亚洲国产欧美在线人成| 国产免费一区二区三区视频| 欧美电影h版| 欧美日韩成人在线| 午夜诱惑痒痒网| 国产色噜噜噜91在线精品| 日韩av在线免播放器| 国产人妻大战黑人20p| 日韩精品1区| 久久99久久99精品免观看粉嫩| 国产一级片视频| 日韩精品电影在线| 川上优av一区二区线观看| 精品黑人一区二区三区在线观看 | 免费在线视频一区| 成人有码视频在线播放| 高潮毛片7777777毛片| 久久麻豆一区二区| 在线无限看免费粉色视频| 日本在线观看大片免费视频| 精品日本美女福利在线观看| av在线无限看| youjizz亚洲| 亚洲夜晚福利在线观看| 激情五月婷婷在线| 三级影片在线观看欧美日韩一区二区| 91精品在线播放| 日韩欧美在线番号| 亚洲欧美日韩国产中文在线| 成熟了的熟妇毛茸茸| 青青在线精品| 亚洲欧美另类在线观看| 国产稀缺精品盗摄盗拍| 亚洲一区免费| 亚洲曰本av电影| 国产三级在线观看| 午夜日韩在线电影| 日本少妇一区二区三区| 狠狠做深爱婷婷综合一区| 欧美精品福利视频| 在线免费观看一区二区| 2023国产精品视频| 浴室偷拍美女洗澡456在线| 午夜伦理福利在线| 日韩一级二级三级| 国产在线免费看| 日韩和欧美一区二区三区| 国产女人水真多18毛片18精品| 18视频免费网址在线观看| 精品福利在线观看| 国产xxx在线观看| 欧美大黑bbbbbbbbb在线| 欧美性资源免费| 黄色一级大片在线免费看国产一| 日韩一区欧美一区| 亚洲三级视频网站| 九九久久精品| 2019中文在线观看| 天天操天天操天天| 亚洲综合久久av| 成年人性生活视频| 亚洲精品久久久| 成人精品一区二区三区| 大胆av不用播放器在线播放 | 天天躁日日躁狠狠躁欧美巨大小说| 久久久精品中文字幕| 亚洲字幕av一区二区三区四区| 久久精品人人做| 精品免费国产一区二区| 欧美激情在线免费| 国产成人免费91av在线| 蜜桃视频在线免费| 色综合婷婷久久| 成人性生交大免费看| 久久久成人网| 日本日本精品二区免费| 成人国产一区| 日韩中文娱乐网| 夜夜骚av一区二区三区| 国产精品久久久久三级| 亚洲综合日韩欧美| 98精品视频| 亚洲中国色老太| 青青草原国产在线| 欧美videos中文字幕| 国产午夜福利精品| 91麻豆精品一区二区三区| 日韩欧美精品在线观看视频| 久久99久久人婷婷精品综合| 国产成人午夜视频网址| 91ph在线| 欧美一级专区免费大片| 日本少妇吞精囗交| 91亚洲精品一区二区乱码| 情侣黄网站免费看| 日韩欧美一区二区三区免费看| 成人久久一区二区| 日日夜夜天天综合入口| 日韩国产欧美精品在线 | 久久一区亚洲| 亚洲一区二区三区免费观看| 久久久精品区| 97热精品视频官网| 国产福利电影在线| 欧美一级欧美三级| 毛片毛片女人毛片毛片| 中文一区一区三区高中清不卡| 一区二区三区四区毛片| 在线高清一区| 色噜噜狠狠一区二区三区| 亚洲免费看片| 81精品国产乱码久久久久久| 国产69精品久久app免费版| 337p亚洲精品色噜噜噜| 日本特黄一级片| 亚洲国产成人自拍| 蜜桃色一区二区三区| 久久久久久久波多野高潮日日| 法国空姐在线观看免费| 亚洲警察之高压线| 91牛牛免费视频| 久久r热视频| 欧美成人免费网| 免费在线超碰| 亚洲精品一区二区三区四区高清| 午夜久久久久久久久久影院| 亚洲免费在线播放| 无码国产69精品久久久久同性| 国产一二精品视频| 日韩欧美黄色大片| 伊人久久婷婷| 五月天综合婷婷| 国产精品欧美三级在线观看| 动漫精品视频| 国产精品第一国产精品| 97视频在线观看免费| 黄色免费网站在线观看| 亚洲精品综合精品自拍| 精品人妻一区二区三区换脸明星| 欧美三级在线视频| 亚洲免费在线视频观看| 亚洲综合色视频| 久久国产波多野结衣| 久久久精品tv| aa一级黄色片| 成人精品视频网站| 国产黄色一区二区三区| 久久99精品久久久久婷婷| 成人一级片网站| 999亚洲国产精| 日韩精品视频在线观看视频| 亚洲第一天堂| 中文字幕一区二区三区乱码| 欧美日韩爱爱| 欧美日产一区二区三区在线观看| 欧美电影免费网站| 操人视频欧美| 亚洲性视频在线| 亚洲资源在线看| 视频二区欧美| 99国产超薄丝袜足j在线观看| 成人在线日韩| 95av在线视频| 久久伊人久久| 亚洲在线免费观看| 精品一区二区三区中文字幕在线 | 97在线视频免费播放| 欧洲在线视频| 久久久久久久久久久亚洲| 天堂8中文在线| 欧美极品美女电影一区| 国产美女情趣调教h一区二区| 九九热这里只有精品免费看| 在线āv视频| 欧美激情精品久久久久久| 欧美人动性xxxxz0oz| 欧美高清性猛交| 爱啪啪综合导航| 91av在线视频观看| 欧美日韩视频网站| 国产精品久久久久久中文字| 国产精品第一国产精品| 91香蕉亚洲精品| 亚洲欧美日本国产| 韩国精品一区二区三区六区色诱| 国产欧美三级电影| 欧美二区在线看| 第一会所亚洲原创| 裸体裸乳免费看| 黄色亚洲精品| 三级4级全黄60分钟| 日本欧美一区二区| 亚洲一二三av| 成人av在线影院| 在线观看国产精品一区| 中文字幕乱码久久午夜不卡| 日本一级二级视频| 精品福利在线看| 中文字幕在线播放av| 日韩一区二区三区免费观看| 欧美 日韩 国产 成人 在线| 亚洲三级 欧美三级| 日本电影全部在线观看网站视频| 欧美美女18p| 自拍偷拍欧美视频| 国产有码一区二区| 99久久免费精品国产72精品九九| 久久这里精品国产99丫e6| 欧美疯狂party性派对| 欧美黑人在线观看| 快she精品国产999| 成人黄色一级大片| 成人h动漫精品一区二区| 这里只有久久精品| 又紧又大又爽精品一区二区| 久久国产精品系列| 欧美一区二区三区四区久久| 三级在线播放| 欧美乱大交xxxxx| 欧美日韩国产网站| 国产精品视频500部| 成人精品影院| 欧美 日韩 国产 高清| 韩国精品在线观看| 亚洲av无码国产精品久久| 亚洲天堂福利av| 日日骚av一区二区| 欧美一级片免费看| av影片在线看| 2023亚洲男人天堂| 午夜久久av| 亚洲人成77777| 欧美亚洲三级| 永久免费未满蜜桃| 《视频一区视频二区| 国产一级一级国产| 亚洲黄一区二区| 自由的xxxx在线视频| 成人免费高清完整版在线观看| 欧美极品在线观看| 99精品在线免费视频| 国产成人精品在线看| 精品国产大片大片大片| 色综合久久天天| 午夜激情小视频| 久久久久久九九九| 日韩欧美一级| 黑人巨大国产9丨视频| 日本aⅴ免费视频一区二区三区| 熟妇高潮精品一区二区三区| 亚洲一区二区三区爽爽爽爽爽| 国产一区二区网站| 最新的欧美黄色| 国产原创一区| 一本一道久久a久久综合精品 | 国产精品久久久久久av福利软件| 欧美a大片欧美片| 国产免费黄色一级片| 国产精品996| 国产精品老熟女一区二区| 在线观看91精品国产麻豆| 91大神在线网站| 国产美女搞久久| 日韩综合网站| 粉色视频免费看| 国产精品家庭影院| 国产精品国产三级国产aⅴ| 精品国产欧美一区二区三区成人| 日韩一级二级| 亚洲国产精品www| 蜜桃一区二区三区四区| 蜜桃av免费观看| 欧美精选一区二区| 久久99精品久久| 亚洲一区久久久| 亚洲性视频h| 亚洲国产第一区| 精品欧美aⅴ在线网站| 深夜福利免费在线观看| 日韩av高清不卡| 成人情趣视频网站| 亚洲天堂国产视频| 亚洲另类中文字| 涩涩视频免费看| 日韩av三级在线观看| 成人午夜av| 欧美熟妇另类久久久久久多毛| 亚洲午夜精品网| 深夜福利视频在线观看| 国产精品美女在线观看| 91精品精品| 亚洲精品乱码久久久久久蜜桃欧美| 婷婷亚洲久悠悠色悠在线播放 | 久久国产一区二区三区| 国内精品视频| 2018国产在线| 欧美国产综合一区二区| 国产又粗又长视频| 欧美国产日本高清在线| 欧美调教视频| 欧美特级aaa| 亚洲综合精品自拍| 毛片网站在线| 91久久在线播放| 亚洲美女91| 性爱在线免费视频| 精品国产sm最大网站| 日本综合久久| www.一区二区.com| 久久久.com| 成人黄色在线观看视频| 欧美中文在线视频| 久久精品影视| 色噜噜日韩精品欧美一区二区| 7799精品视频| 亚洲黄色中文字幕| 亚洲一区 在线播放| 久久久综合九色合综国产精品| 国产视频一区二区三区四区五区| 91精品国产91久久久久久吃药| 久久久综合色| www.88av| 91精品国产免费| 天天综合网站| 男女啪啪免费视频网站| 中文字幕一区二区三区在线观看| 外国精品视频在线观看|