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

JavaScript與異步編程

開發 前端
因為 setTimeout 的存在,至少在被 ECMA 標準化的那一刻起,JavaScript 就支持異步編程了。與其他語言的 sleep 不同,setTimeout 是異步的——它不會阻擋當前程序繼續往下執行。然而異步編程真正發展壯大,Ajax 的流行功不可沒。

JavaScript與異步編程

【引自老帖子的博客】什么是異步(Asynchrony)

按照維基百科上的解釋:獨立于主控制流之外發生的事件就叫做異步。比如說有一段順序執行的代碼

  1. void function main() { 
  2.   fA(); 
  3.   fB(); 
  4. }(); 

 

fA => fB 是順序執行的,永遠都是 fA 在 fB 的前面執行,他們就是 同步 的關系。加入這時使用 setTimeout 將 fB 延后

  1. void function main() { 
  2.   setTimeout(fA, 1000); 
  3.   fB(); 
  4. }(); 

 

這時,fA 相對于 fB 就是異步的。main 函數只是聲明了要在一秒后執行一次 fA,而并沒有立刻執行它。這時,fA 的控制流就獨立于 main 之外。

JavaScript——天生異步的語言

因為 setTimeout 的存在,至少在被 ECMA 標準化的那一刻起,JavaScript 就支持異步編程了。與其他語言的 sleep 不同,setTimeout 是異步的——它不會阻擋當前程序繼續往下執行。

然而異步編程真正發展壯大,Ajax 的流行功不可沒。Ajax 中的 A(Asynchronous)真正點到了異步的概念——這還是 IE5、IE6 的時代。

回調函數——異步編程之痛

異步任務執行完畢之后怎樣通知開發者呢?回調函數是最樸素的,容易想到的實現方式。于是從異步編程誕生的那一刻起,它就和回調函數綁在了一起。

例如 setTimeout。這個函數會起一個定時器,在超過指定時間后執行指定的函數。比如在一秒后輸出數字 1,代碼如下:

  1. setTimeout(() => { 
  2.   console.log(1); 
  3. }, 1000); 

 

常規用法。如果需求有變,需要每秒輸出一個數字(當然不是用 setInterval),JavaScript 的初學者可能會寫出這樣的代碼:

  1. for (let i = 1; i < 10; ++i) { 
  2.   setTimeout(() => { // 錯誤! 
  3.     console.log(i); 
  4.   }, 1000); 

 

執行結果是等待 1 秒后,一次性輸出了所有結果。因為這里的循環是同時啟了 10 個定時器,每個定時器都等待 1 秒,結果當然是所有定時器在 1 秒后同時超時,觸發回調函數。

解法也簡單,只需要在前一個定時器超時后再啟動另一個定時器,代碼如下:

  1. setTimeout(() => { 
  2.   console.log(1); 
  3.   setTimeout(() => { 
  4.     console.log(2); 
  5.     setTimeout(() => { 
  6.       console.log(3); 
  7.       setTimeout(() => { 
  8.         console.log(4); 
  9.         setTimeout(() => { 
  10.           console.log(5); 
  11.           setTimeout(() => { 
  12.             // ... 
  13.           }, 1000); 
  14.         }, 1000); 
  15.       }, 1000) 
  16.     }, 1000) 
  17.   }, 1000) 
  18. }, 1000); 

 

層層嵌套,結果就是這樣的漏斗形代碼。可能有人想到了新標準中的 Promise,可以改寫如下:

  1. function timeout(delay) { 
  2.   return new Promise(resolve => { 
  3.     setTimeout(resolve, delay); 
  4.   }); 
  5.  
  6. timeout(1000).then(() => { 
  7.   console.log(1); 
  8.   return timeout(1000); 
  9. }).then(() => { 
  10.   console.log(2); 
  11.   return timeout(1000); 
  12. }).then(() => { 
  13.   console.log(3); 
  14.   return timeout(1000); 
  15. }).then(() => { 
  16.   console.log(4); 
  17.   return timeout(1000); 
  18. }).then(() => { 
  19.   console.log(5); 
  20.   return timeout(1000); 
  21. }).then(() => { 
  22.   // .. 
  23. }); 

 

漏斗形代碼是沒了,但代碼量本身并沒減少多少。Promise 并沒能干掉回調函數。

因為回調函數的存在,循環就無法使用。不能循環,那么只能考慮遞歸了,解法如下:

  1. let i = 1; 
  2. function next() { 
  3.   console.log(i); 
  4.   if (++i < 10) { 
  5.     setTimeout(next, 1000); 
  6.   } 
  7. setTimeout(next, 1000); 

 

注意雖然寫法是遞歸,但由于 next 函數都是由瀏覽器調用的,所以實際上并沒有遞歸函數的調用棧結構。

Generator——JavaScript 中的半協程

很多語言都引入了協程來簡化異步編程,JavaScript 也有類似的概念,叫做 Generator。

MDN 上的解釋:Generator 是一種可以中途退出之后重入的函數。他們的函數上下文在每次重入后會被保持。簡而言之,Generator 與普通 Function ***的區別就是:Generator 自身保留上次調用的狀態。

舉個簡單的例子:

  1. function *gen() { 
  2.   yield 1; 
  3.   yield 2; 
  4.   return 3; 
  5.  
  6. void function main() { 
  7.   var iter = gen(); 
  8.   console.log(iter.next().value); 
  9.   console.log(iter.next().value); 
  10.   console.log(iter.next().value); 
  11. }(); 

 

代碼的執行順序是這樣:

  1. 請求 gen,得到一個迭代器 iter。注意此時并未真正執行 gen 的函數體。
  2. 調用 iter.next(),執行 gen 的函數體。
  3. 遇到 yield 1,將 1 返回,iter.next() 的返回值即為 { done: false, value: 1 },輸出 1
  4. 調用 iter.next()。從上次 yield 出去的地方繼續往下執行 gen。
  5. 遇到 yield 2,將 2 返回,iter.next() 的返回值即為 { done: false, value: 2 },輸出 2
  6. 調用 iter.next()。從上次 yield 出去的地方繼續往下執行 gen。
  7. 遇到 return 3,將 3 返回,return 表示整個函數已經執行完畢。iter.next() 的返回值即為 { done: true, value: 3 },輸出 3

調用 Generator 函數只會返回一個迭代器,當用戶主動調用了 iter.next() 后,這個 Generator 函數才會真正執行。

你可以使用 for ... of 遍歷一個 iterator,例如

  1. for (var i of gen()) { 
  2.   console.log(i); 

 

輸出 1 2,*** return 3 的結果不算在內。想用 Generator 的各項生成一個數組也很簡單,Array.from(gen()) 或直接用 [...gen()] 即可,生成 [1, 2] 同樣不包含***的 return 3。

Generator 是異步的嗎

Generator 也叫半協程(semicoroutine),自然與異步關系匪淺。那么 Generator 是異步的嗎?

既是也不是。前面提到,異步是相對的,例如上面的例子

  1. function *gen() { 
  2.   yield 1; 
  3.   yield 2; 
  4.   return 3; 
  5.  
  6. void function main() { 
  7.   var iter = gen(); 
  8.   console.log(iter.next().value); 
  9.   console.log(iter.next().value); 
  10.   console.log(iter.next().value); 
  11. }(); 

 

我們可以很直觀的看到,gen 的方法體與 main 的方法體在交替執行,所以可以肯定的說,gen 相對于 main 是異步執行的。然而此段過程中,整個控制流都沒有交回給瀏覽器,所以說 gen 和 main 相對于瀏覽器是同步執行的。

用 Generator 簡化異步代碼

回到最初的問題:

  1. for (let i = 0; i < 10; ++i) { 
  2.   setTimeout(() => { 
  3.     console.log(i); 
  4.   }, 1000); 
  5.   // 等待上面 setTimeout 執行完畢 

 

關鍵在于如何等待前面的 setTimeout 觸發回調后再執行下一輪循環。如果使用 Generator,我們可以考慮在 setTimeout 后 yield 出去(控制流返還給瀏覽器),然后在 setTimeout 觸發的回調函數中 next,將控制流交還回給代碼,執行下一段循環。

  1. let iter; 
  2.  
  3. function* run() { 
  4.   for (let i = 1; i < 10; ++i) { 
  5.     setTimeout(() => iter.next(), 1000); 
  6.     yield; // 等待上面 setTimeout 執行完畢 
  7.     console.log(i); 
  8.   } 
  9.  
  10. iter = run(); 
  11. iter.next(); 

 

代碼的執行順序是這樣:

  • 請求 run,得到一個迭代器 iter。注意此時并未真正執行 run 的函數體。
  • 調用 iter.next(),執行 run 的函數體。
  • 循環開始,i 初始化為 1。
  • 執行 setTimeout,啟動一個定時器,回調函數延后 1 秒執行。
  • 遇到 yield(即 yield undefined),控制流返回到***的 iter.next() 之后。因為后面沒有其他代碼了,瀏覽器獲得控制權,響應用戶事件,執行其他異步代碼等。
  • 1 秒后,setTimeout 超時,執行回調函數 () => iter.next()。
  • 調用 iter.next()。從上次 yield 出去的地方繼續往下執行,即 console.log(i),輸出 i 的值。
  • 一次循環結束,i 自增為 2,回到第 4 步繼續執行
  • ……

這樣即實現了類似同步 sleep 的要求。

async、await——用同步語法寫異步代碼

上面的代碼畢竟需要手工定義迭代器變量,還要手工 next;更重要的是與 setTimeout 緊耦合,無法通用。

我們知道 Promise 是異步編程的未來。能不能把 Promise 和 Generator 結合使用呢?這樣考慮的結果就是 async 函數。

用 async 得到代碼如下

  1. function timeout(delay) { 
  2.   return new Promise(resolve => { 
  3.     setTimeout(resolve, delay); 
  4.   }); 
  5.  
  6. async function run() { 
  7.   for (let i = 1; i < 10; ++i) { 
  8.     await timeout(1000); 
  9.     console.log(i); 
  10.   } 
  11. run(); 

 

按照 Chrome 的設計文檔,async 函數內部就是被編譯為 Generator 執行的。run 函數本身會返回一個 Promise,用于使主調函數得知 run 函數什么時候執行完畢。所以 run() 后面也可以 .then(xxx),甚至直接 await run()。

注意有時候我們的確需要幾個異步事件并行執行(比如調用兩個接口,等兩個接口都返回后執行后續代碼),這時就不要過度使用 await,例如:

  1. const a = await queryA(); // 等待 queryA 執行完畢后 
  2. const b = await queryB(); // 執行 queryB 
  3. doSomething(a, b); 

 

這時 queryA 和 queryB 就是串行執行的。可以略作修改:

  1. const promiseA = queryA(); // 執行 queryA 
  2. const b = await queryB(); // 執行 queryB 并等待其執行結束。這時同時 queryA 也在執行。 
  3. const a = await promiseA(); // 這時 queryB 已經執行結束。繼續等待 queryA 執行結束 
  4. doSomething(a, b); 

 

我個人比較喜歡如下寫法:

  1. const [ a, b ] = await Promise.all([ queryA(), queryB() ]); 
  2. doSomething(a, b); 

 

將 await 和 Promise 結合使用,效果更佳!

結束語

如今 async 函數已經被各大主流瀏覽器實現(除了 IE)。如果要兼容舊版瀏覽器,可以使用 babel 將其編譯為 Generator。如果還要兼容只支持 ES5 的瀏覽器,還可以繼續把 Generator 編譯為 ES5。編譯后的代碼量比較大,小心代碼膨脹。

如果是用 node 寫 Server,那就不用糾結了直接用就是了。koa 是用 async 是你的好幫手。

責任編輯:龐桂玉 來源: 老帖子的博客
相關推薦

2020-10-15 13:29:57

javascript

2015-04-22 10:50:18

JavascriptJavascript異

2014-05-23 10:12:20

Javascript異步編程

2016-09-07 20:43:36

Javascript異步編程

2013-03-08 09:33:25

JavaScript同步異步

2021-06-02 09:01:19

JavaScript 前端異步編程

2011-11-11 15:47:22

JavaScript

2021-12-10 07:47:30

Javascript異步編程

2017-05-11 20:20:59

JavascriptPromiseWeb

2011-11-10 10:23:56

Jscex

2021-06-06 19:51:07

JavaScript異步編程

2023-12-04 13:22:00

JavaScript異步編程

2011-07-27 14:10:43

javascript

2022-10-31 09:00:24

Promise數組參數

2013-04-01 15:38:54

異步編程異步編程模型

2013-01-07 10:44:00

JavaScriptjQueryJS

2016-10-21 11:04:07

JavaScript異步編程原理解析

2021-11-01 22:36:04

JavaScript

2020-03-23 11:28:56

PythonJavaScript技術

2021-06-28 08:10:59

JavaScript異步編程
點贊
收藏

51CTO技術棧公眾號

中文乱码免费一区二区三区下载| 精品网站在线| 91麻豆蜜桃一区二区三区| 日本三级久久久| 欧美手机在线观看| 成人高潮视频| 欧美日韩一级视频| 亚洲熟妇无码av在线播放| 撸视在线观看免费视频| 韩国成人在线视频| 日韩美女主播视频| 欧美丰满艳妇bbwbbw| 国产亚洲欧美日韩在线观看一区二区| 欧美精品亚洲二区| 无码人妻少妇伦在线电影| 黄色影院在线播放| 风间由美一区二区三区在线观看| 日本成熟性欧美| 欧美色图亚洲天堂| 日韩欧美二区| 亚洲精品自产拍| 日日夜夜精品视频免费观看| 全亚洲第一av番号网站| 亚洲综合一区二区| 亚洲一卡二卡三卡| 每日更新av在线播放| 国产成人自拍网| 国产美女搞久久| 中文字幕在线观看视频网站| 欧美日韩亚洲三区| 日日噜噜噜夜夜爽亚洲精品| 毛片网站免费观看| 国内精品国产成人国产三级粉色| 欧美一区二区三区在线视频| 天天操天天爽天天射| 美女视频在线免费| 亚洲18女电影在线观看| 国产精品av免费| www黄在线观看| 久久综合久色欧美综合狠狠| 国产伦精品一区二区三| 国产黄色片免费观看| 久久国产精品露脸对白| 国产精品美女久久| 日韩黄色一级视频| 久热精品视频| 国产91免费看片| 亚洲精品成人在线视频| 亚洲伦伦在线| 国语自产精品视频在线看抢先版图片| 欧美精品色哟哟| 欧美区国产区| 色综合五月天导航| 国产一级中文字幕| 精品av久久久久电影| 欧美日韩国产999| 亚洲色图综合区| 欧美在线首页| 色综合久久悠悠| 久久久久无码精品国产| 极品中文字幕一区| 高清一区二区三区日本久| 国产精品成人av久久| 亚洲大胆视频| 91精品国产91久久久久久不卡| 免费一级特黄特色大片| 国产欧美在线| 国产成人精品免费久久久久| 亚洲大尺度在线观看| 美女视频黄频大全不卡视频在线播放 | 97超碰色婷婷| 四虎成人在线观看| 奇米四色…亚洲| 成人精品视频99在线观看免费| 97成人在线观看| 国产激情一区二区三区四区 | www夜片内射视频日韩精品成人| 国产在线精品一区二区不卡了| 91网在线免费观看| 后进极品白嫩翘臀在线视频| 91丝袜国产在线播放| 日韩精品久久久| a视频在线观看| 午夜精品久久久久久久99樱桃 | 久久国产欧美日韩精品| 91精品婷婷国产综合久久蝌蚪| 色婷婷av一区二区三区之e本道| 成人午夜私人影院| 欧洲一区二区日韩在线视频观看免费| av二区在线| 亚洲国产va精品久久久不卡综合| 久久久999视频| 四虎国产精品永久在线国在线| 91精品国产91久久综合桃花| bl动漫在线观看| 日本在线电影一区二区三区| 欧美激情18p| 中文字幕一区二区人妻视频| 国产精品一区二区三区99| 精品一区二区三区自拍图片区 | 国产精品视频你懂的| 中文字幕人妻熟女人妻洋洋| 欧美大片免费观看网址| 日韩欧美123| 永久免费毛片在线观看| 在线播放一区| 91精品国产综合久久久久久蜜臀 | 青青成人在线| 亚乱亚乱亚洲乱妇| 亚洲最色的网站| 91国产精品视频在线观看| 哺乳挤奶一区二区三区免费看| 亚洲午夜精品久久久久久久久久久久 | 久久久久久久久久久久久国产精品| 亚洲精品三区| 亚洲女人天堂色在线7777| 老熟妇高潮一区二区三区| 亚洲综合日本| 国产伦精品一区二区三区四区免费| av大全在线免费看| 欧美性极品xxxx做受| 亚洲熟女一区二区三区| 99精品在线观看| 国产精品久久久久久久久久久不卡 | 激情五月激情综合网| 欧美日韩三区四区| av成人 com a| 日韩精品综合一本久道在线视频| 91ts人妖另类精品系列| 久久精品系列| 国产综合欧美在线看| 男女视频在线| 日韩精品一区二区三区视频| 日韩一级片av| 国产一区在线看| 日本特级黄色大片| 亚洲一区二区av| www.日韩av.com| 在线免费看av片| 国产精品污污网站在线观看| 麻豆传传媒久久久爱| 啪啪激情综合网| 4444欧美成人kkkk| 欧美套图亚洲一区| 日韩欧美在线播放| 久久亚洲无码视频| 天堂在线一区二区| 日本在线一区| 粉嫩91精品久久久久久久99蜜桃| 国产午夜精品视频| 欧美在线视频精品| 国产精品麻豆视频| 中文字幕丰满乱码| 亚洲经典一区| 国产传媒欧美日韩| 成人免费一区二区三区牛牛| 精品国产一区a| 日韩av片在线播放| 99久久精品费精品国产一区二区| 国产日本在线播放| 欧美日韩一区二区三区在线电影 | 日韩免费小视频| 正在播放欧美视频| 国产精品亚洲lv粉色| 亚洲欧美日韩在线播放| 美女流白浆视频| 99精品视频免费| 茄子视频成人在线观看 | 日本大胆在线观看| 亚洲激情在线观看视频免费| 日韩一区二区视频在线| 欧美高清在线一区二区| 999久久久精品视频| 国产一区观看| 欧美一卡2卡3卡4卡无卡免费观看水多多 | 国产欧美亚洲精品| 影音先锋男人资源在线| 亚洲精品乱码久久久久久金桔影视| 亚洲自拍一区在线观看| 国产精品伦理在线| 国产综合内射日韩久| 欧美一级播放| 日本不卡一区二区三区四区| 国内露脸中年夫妇交换精品| 国产精品99久久久久久白浆小说| 精品麻豆一区二区三区| 精品无人区太爽高潮在线播放 | 日韩欧美国产二区| 日韩欧美中文在线观看| 日本sm极度另类视频| v片在线观看| 亚洲欧美国产视频| xxxwww在线观看| 91成人国产精品| 免费一级片视频| 国产日韩欧美制服另类| 99国产精品免费视频| 日韩精彩视频在线观看| 国产精品三级一区二区| 成人aaaa| 鲁丝一区二区三区免费| 日韩三级不卡| 国产精品久久久999| 天堂av中文在线| 中文字幕一区电影| 牛牛影视精品影视| 精品国产乱码久久久久久1区2区| 亚洲天堂网视频| 一本久道久久综合中文字幕| 免费网站看av| 综合久久久久久久| 日本爱爱爱视频| 91亚洲精品乱码久久久久久蜜桃| 在线免费观看av网| 日韩激情在线观看| 免费看日本毛片| 欧美日韩国产综合网| 一区一区视频| 欧美丝袜丝交足nylons172| 九九九九精品九九九九| 日韩精品中文字幕一区二区 | 欧美激情亚洲自拍| 成人在线观看亚洲| www.久久色.com| 中文字幕日本在线| 亚洲三级免费看| 色香蕉在线视频| 日韩欧美不卡在线观看视频| 国产伦精品一区二区三区四区| 欧美自拍偷拍一区| 日本免费在线观看视频| 精品久久久久久久久久| 国产午夜免费视频| 一级日本不卡的影视| 欧美做爰爽爽爽爽爽爽| 亚洲欧洲成人自拍| 99热99这里只有精品| 中文字幕不卡在线观看| 精品国产成人亚洲午夜福利| 久久亚洲综合av| 中文字幕丰满乱子伦无码专区| 99综合电影在线视频| 亚洲激情 欧美| 99re这里只有精品首页| av鲁丝一区鲁丝二区鲁丝三区| 成人免费视频网站在线观看| 久草视频福利在线| 北岛玲一区二区三区四区| 先锋资源av在线| www日韩大片| 丰腴饱满的极品熟妇| 国产欧美日韩精品a在线观看| 蜜臀久久99精品久久久久久| 欧美经典一区二区| 国产精品一区二区亚洲| 综合分类小说区另类春色亚洲小说欧美 | 韩国美女主播一区| 久久青草伊人| 国产精品69久久| 欧洲美女精品免费观看视频| 成人国产精品一区| 中文字幕日韩在线| 国产精品免费一区二区三区在线观看 | 亚洲一区二区三区免费| 国产精品毛片va一区二区三区| 极品束缚调教一区二区网站| 久久99国产精品| 日韩中文字幕高清在线观看| 三年中文高清在线观看第6集| 国产精品s色| 黄色一级一级片| 精品一区二区三区在线观看| 少妇欧美激情一区二区三区| bt欧美亚洲午夜电影天堂| 欧美熟妇激情一区二区三区| 亚洲欧美日韩中文字幕一区二区三区| av资源吧首页| 欧美在线色视频| www.久久成人| 亚洲天堂av在线播放| 国产成人l区| 欧美国产亚洲精品久久久8v| 伊人久久综合一区二区| 成人欧美一区二区三区在线| 精品亚洲自拍| 亚洲视频在线二区| 亚洲国产一区二区精品专区| 亚洲色图38p| 国产成a人亚洲精| 久久久久久久久久久久| 亚洲欧美日韩电影| 五月婷婷激情视频| 欧美不卡一二三| www.久久热.com| 久久久免费在线观看| 成人精品一区二区三区电影| 国产精品污www一区二区三区| 国产亚洲欧美日韩在线观看一区二区| 91传媒免费视频| 日本亚洲欧美天堂免费| 国产女人18毛片水真多18| 中文字幕在线一区二区三区| av资源免费观看| 日韩一区二区高清| chinese偷拍一区二区三区| 国内精品久久久久久| 日韩亚洲国产免费| 欧美重口乱码一区二区| 极品日韩av| 五月天国产视频| 国产精品色一区二区三区| 久久国产黄色片| 欧美v国产在线一区二区三区| 亚洲成人三级| 国产成人在线播放| 国产香蕉精品| 欧美无砖专区免费| 国产精品正在播放| 女性裸体视频网站| 91久久精品一区二区三区| 色视频在线看| 久久久久久97| 538任你躁精品视频网免费| 中文字幕一区二区三区四区五区| 日韩中文字幕麻豆| 香蕉视频黄色在线观看| 激情av一区二区| 俄罗斯嫩小性bbwbbw| 九九热这里只有精品6| 国产精品视频一区视频二区| 中文字幕剧情在线观看一区| 喷白浆一区二区| 黄色三级生活片| 欧美在线视频不卡| 午夜伦全在线观看| 国产日韩欧美日韩大片| 成人在线免费观看网站| 国产九九在线视频| 国产欧美一区二区三区网站| 亚洲欧美精品一区二区三区| 日韩精品一区二区视频| sm久久捆绑调教精品一区| 国产欧美日韩伦理| 99成人在线| 中文字幕丰满孑伦无码专区| 欧美香蕉大胸在线视频观看| 外国精品视频在线观看| 欧美与欧洲交xxxx免费观看| 日本国产精品| 日韩中文字幕组| 国产精品色在线| av老司机久久| 久久久久久中文| 亚洲自拍电影| 久久久国产欧美| 国产精品国产成人国产三级 | 精彩视频一区二区三区| 97在线观看视频免费| 欧美一区二区日韩| xxxx成人| 欧洲精品码一区二区三区免费看| 免费一级片91| 欧美又粗又大又长| 亚洲第一网站男人都懂| 三妻四妾的电影电视剧在线观看| 欧美日韩综合久久| 久久激情综合网| 久草视频手机在线观看| 日韩激情在线视频| 国产成人亚洲一区二区三区| 国产一级黄色录像片| www.日韩在线| 成人毛片一区二区三区| 久久久黄色av| 精品三级av在线导航| 无码少妇一区二区三区芒果| 亚洲欧美韩国综合色| 欧美 日韩 国产 成人 在线 91| 欧美壮男野外gaytube| 99精品综合| 色天使在线视频| 9191精品国产综合久久久久久 | 久久久久久美女精品 | 91精品国产高清| 欧美限制电影| 久久精品无码专区| 91久久精品日日躁夜夜躁欧美| av片在线观看免费| 久久久久成人精品免费播放动漫| 麻豆国产精品777777在线| 丰满少妇被猛烈进入一区二区| 亚洲成av人乱码色午夜| 日韩制服诱惑| 久久久性生活视频| 国产精品久久久久久久久动漫| 国产 日韩 欧美 精品| 国产精品视频网站| 国产视频亚洲| 深夜福利影院在线观看| 在线精品高清中文字幕|