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

聊聊JavaScript 異步編程史

開發(fā) 前端
JavaScript 的運行時是跑在單線程上的,是基于事件模型來進行異步任務(wù)觸發(fā)的,不需要考慮共享內(nèi)存加鎖的問題,綁定的事件會按照順序齊齊整整的觸發(fā)。要理解 JavaScript 的異步任務(wù),首先就要理解 JavaScript 的事件模型。

[[403161]]

前言

早期的 Web 應用中,與后臺進行交互時,需要進行 form 表單的提交,然后在頁面刷新后給用戶反饋結(jié)果。在頁面刷新過程中,后臺會重新返回一段 HTML 代碼,這段 HTML 中的大部分內(nèi)容與之前頁面基本相同,這勢必造成了流量的浪費,而且一來一回也延長了頁面的響應時間,總是會讓人覺得 Web 應用的體驗感比不上客戶端應用。

2004 年,AJAX 即“Asynchronous JavaScript and XML”技術(shù)橫空出世,讓 Web 應用的體驗得到了質(zhì)的提升。再到 2006 年,jQuery 問世,將 Web 應用的開發(fā)體驗也提高到了新的臺階。

由于 JavaScript 語言單線程的特點,不管是事件的觸發(fā)還是 AJAX 都是通過回調(diào)的方式進行異步任務(wù)的觸發(fā)。如果我們想要線性的處理多個異步任務(wù),在代碼中就會出現(xiàn)如下的情況:

  1. getUser(token, function (user) { 
  2.   getClassID(userfunction (id) { 
  3.     getClassName(id, function (name) { 
  4.       console.log(name
  5.     }) 
  6.   }) 
  7. }) 

我們經(jīng)常將這種代碼稱為:“回調(diào)地獄”。

事件與回調(diào)

眾所周知,JavaScript 的運行時是跑在單線程上的,是基于事件模型來進行異步任務(wù)觸發(fā)的,不需要考慮共享內(nèi)存加鎖的問題,綁定的事件會按照順序齊齊整整的觸發(fā)。要理解 JavaScript 的異步任務(wù),首先就要理解 JavaScript 的事件模型。

由于是異步任務(wù),我們需要組織一段代碼放到未來運行(指定時間結(jié)束時或者事件觸發(fā)時),這一段代碼我們通常放到一個匿名函數(shù)中,通常稱為回調(diào)函數(shù)。

  1. setTimeout(function () { 
  2.   // 在指定時間結(jié)束時,觸發(fā)的回調(diào) 
  3. }, 800) 
  4. window.addEventListener("resize"function() { 
  5.   // 當瀏覽器視窗發(fā)生變化時,觸發(fā)的回調(diào) 
  6. }) 

未來運行

前面說過回調(diào)函數(shù)的運行是在未來,這就說明回調(diào)中使用的變量并不是在回調(diào)聲明階段就固定的。

  1. for (var i = 0; i < 3; i++) { 
  2.   setTimeout(function () { 
  3.     console.log("i =", i) 
  4.   }, 100) 

這里連續(xù)聲明了三個異步任務(wù),100毫秒 后會輸出變量 i 的結(jié)果,按照正常的邏輯應該會輸出 0、1、2這三個結(jié)果。

然而,事實并非如此,這也是我們剛開始接觸 JavaScript 的時候會遇到的問題,因為回調(diào)函數(shù)的實際運行時機是在未來,所以輸出的 i 的值是循環(huán)結(jié)束時的值,三個異步任務(wù)的結(jié)果一致,會輸出三個 i = 3。

經(jīng)歷過這個問題的同學,一般都知道,我們可以通過閉包的方式,或者重新聲明局部變量的方式解決這個問題。

事件隊列

事件綁定之后,會將所有的回調(diào)函數(shù)存儲起來,然后在運行過程中,會有另外的線程對這些異步調(diào)用的回調(diào)進行調(diào)度的處理,一旦滿足“觸發(fā)”條件就會將回調(diào)函數(shù)放入到對應的事件隊列(這里只是簡單的理解成一個隊列,實際存在兩個事件隊列:宏任務(wù)、微任務(wù))中。

滿足觸發(fā)條件一般有以下幾種情況:

  1. DOM 相關(guān)的操作進行的事件觸發(fā),比如點擊、移動、失焦等行為;
  2. IO 相關(guān)的操作,文件讀取完成、網(wǎng)絡(luò)請求結(jié)束等;
  3. 時間相關(guān)的操作,到達定時任務(wù)的約定時間;

上面的這些行為發(fā)生時,代碼中之前指定的回調(diào)函數(shù)就會被放入一個任務(wù)隊列中,主線程一旦空閑,就會將其中的任務(wù)按照先進先出的流程一一執(zhí)行。當有新的事件被觸發(fā)時,又會重新放入到回調(diào)中,如此循環(huán)🔄,所以 JavaScript 的這一機制通常被稱為“事件循環(huán)機制”。

  1. for (var i = 1; i <= 3; i++) { 
  2.   const x = i 
  3.   setTimeout(function () { 
  4.     console.log(`第${x}個setTimout被執(zhí)行`) 
  5.   }, 100) 

可以看到,其運行順序滿足隊列先進先出的特點,先聲明的先被執(zhí)行。

線程的阻塞

由于 JavaScript 單線程的特點,定時器其實并不可靠,當代碼遇到阻塞的情況,即使事件到達了觸發(fā)的時間,也會一直等在主線程空閑才會運行。

  1. const start = Date.now() 
  2. setTimeout(function () { 
  3.   console.log(`實際等待時間: ${Date.now() - start}ms`) 
  4. }, 300) 
  5.  
  6. // while循環(huán)讓線程阻塞 800ms 
  7. while(Date.now() - start < 800) {} 

上面代碼中,定時器設(shè)置了 300ms 后觸發(fā)回調(diào)函數(shù),如果代碼沒有遇到阻塞,正常情況下會 300ms后,會輸出等待時間。

但是我們在還沒加了一個 while 循環(huán),這個循環(huán)會在 800ms 后才結(jié)束,主線程一直被這個循環(huán)阻塞在這里,導致時間到了回調(diào)函數(shù)也沒有正常運行。

Promise

事件回調(diào)的方式,在編碼的過程中,就特別容易造成回調(diào)地獄。而 Promise 提供了一種更加線性的方式編寫異步代碼,有點類似于管道的機制。

  1. // 回調(diào)地獄 
  2. getUser(token, function (user) { 
  3.   getClassID(userfunction (id) { 
  4.     getClassName(id, function (name) { 
  5.       console.log(name
  6.     }) 
  7.   }) 
  8. }) 
  9.  
  10. // Promise 
  11. getUser(token).then(function (user) { 
  12.   return getClassID(user
  13. }).then(function (id) { 
  14.   return getClassName(id) 
  15. }).then(function (name) { 
  16.   console.log(name
  17. }).catch(function (err) { 
  18.   console.error('請求異常', err) 
  19. }) 

Promise 在很多語言中都有類似的實現(xiàn),在 JavaScript 發(fā)展過程中,比較著名的框架 jQuery、Dojo 也都進行過類似的實現(xiàn)。2009 年,推出的 CommonJS 規(guī)范中,基于 Dojo.Deffered 的實現(xiàn)方式,提出 Promise/A 規(guī)范。也是這一年 Node.js 橫空出世,Node.js 很多實現(xiàn)都是依照 CommonJS 規(guī)范來的,比較熟悉的就是其模塊化方案。

早期的 Node.js 中也實現(xiàn)了 Promise 對象,但是 2010 年的時候,Ry(Node.js 作者)認為 Promise 是一種比較上層的實現(xiàn),而且 Node.js 的開發(fā)本來就依賴于 V8 引擎,V8 引擎原生也沒有提供 Promise 的支持,所以后來 Node.js 的模塊使用了 error-first callback 的風格(cb(error, result))。

  1. const fs = require('fs'
  2. // 第一個參數(shù)為 Error 對象,如果不為空,則表示出現(xiàn)異常 
  3. fs.readFile('./README.txt'function (err, buffer) { 
  4.   if (err !== null) { 
  5.     return 
  6.   } 
  7.   console.log(buffer.toString()) 
  8. }) 

這一決定也導致后來 Node.js 中出現(xiàn)了各式各樣的 Promise 類庫,比較出名的就是 Q.js、Bluebird。關(guān)于 Promise 的實現(xiàn),之前有寫過一篇文章,感興趣可以看看:《手把手教你實現(xiàn) Promise》。

在 Node.js@8 之前,V8 原生的 Promise 實現(xiàn)有一些性能問題,導致原生 Promise 的性能甚至不如一些第三方的 Promise 庫。

所以,低版本的 Node.js 項目中,經(jīng)常會將 Promise 進行全局的替換:

  1. const Bulebird = require('bluebird'
  2. global.Promise = Bulebird 

Generator & co

Generator(生成器) 是 ES6 提供的一種新的函數(shù)類型,主要是用于定義一個能自我迭代的函數(shù)。通過 function * 的語法能夠構(gòu)造一個 Generator 函數(shù),函數(shù)執(zhí)行后會返回一個iteration(迭代器)對象,該對象具有一個 next() 方法,每次調(diào)用 next() 方法就會在 yield 關(guān)鍵詞前面暫停,直到再次調(diào)用 next() 方法。

  1. function * forEach(array) { 
  2.   const len = array.length 
  3.   for (let i = 0; i < len; i ++) { 
  4.     yield i; 
  5.   } 
  6. const it = forEach([2, 4, 6]) 
  7. it.next() // { value: 2, done: false } 
  8. it.next() // { value: 4, done: false } 
  9. it.next() // { value: 6, done: false } 
  10. it.next() // { value: undefined, done: true } 

next() 方法會返回一個對象,對象有兩個屬性 value、done:

  • value:表示 yield 后面的值;
  • done:表示函數(shù)是否執(zhí)行完畢;

由于生成器函數(shù)具有中斷執(zhí)行的特點,將生成器函數(shù)當做一個異步操作的容器,再配合上 Promise 對象的 then 方法可以將交回異步邏輯的執(zhí)行權(quán),在每個 yeild 后面都加上一個 Promise 對象,就能讓迭代器不停的往下執(zhí)行。

  1. function * gen(token) { 
  2.   const user = yield getUser(token) 
  3.   const cId = yield getClassID(user
  4.   const name = yield getClassName(cId) 
  5.   console.log(name
  6.  
  7. const g = gen('xxxx-token'
  8.  
  9. // 執(zhí)行 next 方法返回的 value 為一個 Promise 對象 
  10. const { value: promise1 } = g.next() 
  11. promise1.then(user => { 
  12.   // 傳入第二個 next 方法的值,會被生成器中第一個 yield 關(guān)鍵詞前面的變量接受 
  13.   // 往后推也是如此,第三個 next 方法的值,會被第二個 yield 前面的變量接受 
  14.   // 只有第一個 next 方法的值會被拋棄 
  15.   const { value: promise2 } = gen.next(user).value 
  16.   promise2.then(cId => { 
  17.     const { value: promise3, done } = gen.next(cId).value 
  18.     // 依次先后傳遞,直到 next 方法返回的 done 為 true 
  19.   }) 
  20. }) 

我們將上面的邏輯進行一下抽象,讓每個 Promise 對象正常返回后,就自動調(diào)用 next,讓迭代器進行自執(zhí)行,直到執(zhí)行完畢(也就是 done 為 true)。

  1. function co(gen, ...args) { 
  2.   const g = gen(...args) 
  3.   function next(data) { 
  4.     const { value: promise, done } = g.next(data) 
  5.     if (done) return promise 
  6.     promise.then(res => { 
  7.       next(res) // 將 promise 的結(jié)果傳入下一個 yield 
  8.     }) 
  9.   } 
  10.    
  11.   next() // 開始自執(zhí)行 
  12.  
  13. co(gen, 'xxxx-token'

這也就是 koa 早期的核心庫 co 的實現(xiàn)邏輯,只是 co 進行了一些參數(shù)校驗與錯誤處理。通過 generator 加上 co 能夠讓異步流程更加的簡單易讀,對開發(fā)者而言肯定是階段歡喜的一件事。

async/await

async/await 可以說是 JavaScript 異步變成的解決方案,其實本質(zhì)上就是 Generator & co 的一個語法糖,只需要在異步的生成器函數(shù)前加上 async,然后將生成器函數(shù)內(nèi)的 yield 替換為 await。

  1. async function fun(token) { 
  2.   const user = await getUser(token) 
  3.   const cId = await getClassID(user
  4.   const name = await getClassName(cId) 
  5.   console.log(name
  6.  
  7. fun() 

 async 函數(shù)將自執(zhí)行器進行了內(nèi)置,同時 await 后不限制為 Promise 對象,可以為任意值,而且 async/await 在語義上比起生成器的 yield 更加清楚,一眼就能明白這是一個異步操作。

 

責任編輯:姜華 來源: 自然醒的筆記本
相關(guān)推薦

2020-10-15 13:29:57

javascript

2015-04-22 10:50:18

JavascriptJavascript異

2014-05-23 10:12:20

Javascript異步編程

2021-10-22 08:29:14

JavaScript事件循環(huán)

2017-07-13 12:12:19

前端JavaScript異步編程

2016-09-07 20:43:36

Javascript異步編程

2011-11-11 15:47:22

JavaScript

2022-07-01 08:00:44

異步編程FutureTask

2025-02-06 16:51:30

2021-12-10 07:47:30

Javascript異步編程

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數(shù)組參數(shù)

2023-11-29 07:10:50

python協(xié)程異步編程

2020-07-02 07:44:27

Spring教程異步

2013-04-01 15:38:54

異步編程異步編程模型

2013-01-07 10:44:00

JavaScriptjQueryJS

2016-10-21 11:04:07

JavaScript異步編程原理解析
點贊
收藏

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

亚洲成人免费网站| 国产精品初高中害羞小美女文| 欧美日产国产成人免费图片| 稀缺呦国内精品呦| 欧美成人ⅴideosxxxxx| 国产精品久久久久久久久快鸭| 亚洲自拍中文字幕| 国产农村妇女aaaaa视频| 成人午夜国产| 精品国产免费一区二区三区四区| 免费观看日韩毛片| 黄色免费网站在线观看| 99精品视频一区二区三区| 国产精品久久久久久久午夜| 黄色一级片在线| 少妇精品久久久一区二区三区| 制服丝袜日韩国产| 国产成人av影视| 男人天堂亚洲| 最新热久久免费视频| 精品国产乱码久久久久久蜜柚 | 久久一区91| 337p日本欧洲亚洲大胆色噜噜| 天天操天天爽天天射| 欧洲精品二区| 国产精品福利电影一区二区三区四区| 国产精品手机在线| 亚洲怡红院av| 噜噜噜躁狠狠躁狠狠精品视频| 久久国产精彩视频| 日韩一级片在线免费观看| 国产福利一区二区精品秒拍| 欧美久久久久久蜜桃| 欧美一级片中文字幕| 激情图片在线观看高清国产| 亚洲特级片在线| 日韩偷拍一区二区| 天堂v视频永久在线播放| 国产做a爰片久久毛片| 国产精品成人在线| 一级黄色免费网站| 9国产精品视频| 欧美国产精品日韩| 99热精品免费| 亚洲九九视频| 美女黄色丝袜一区| 五月天免费网站| 成人影视亚洲图片在线| 亚洲欧洲一区二区三区久久| 无码人妻aⅴ一区二区三区| 国产suv精品一区| 日韩美女视频在线| 18禁一区二区三区| 亚洲**毛片| 欧美高清一级片在线| 亚洲欧美国产中文| 日韩成人在线电影| 欧美日韩精品一区二区| 天堂网在线免费观看| 男女啪啪999亚洲精品| 欧美少妇性性性| 91制片厂毛片| 亚洲三级电影| 欧美午夜电影在线播放| 在线免费观看视频黄| 成人高清一区| 欧美一区二区三区在线| 亚洲一区二区三区四区精品| 久久天堂久久| 精品国产91乱码一区二区三区| 理论片大全免费理伦片| 欧美日韩大片免费观看| 亚洲精品视频播放| 1024手机在线观看你懂的| 成人羞羞动漫| 欧美成人午夜免费视在线看片| 欧美又粗又大又长| 在线不卡亚洲| 热久久美女精品天天吊色| 无码人妻熟妇av又粗又大| 免费一区二区视频| 亚洲影院污污.| 内射后入在线观看一区| xnxx国产精品| 神马一区二区影院| av免费网站在线观看| 亚洲午夜羞羞片| 欧美伦理视频在线观看| 成人豆花视频| 亚洲精品suv精品一区二区| 人人妻人人藻人人爽欧美一区| 99精品视频精品精品视频 | 精品精品导航| 在线观看区一区二| 古装做爰无遮挡三级聊斋艳谭| 久久1电影院| 在线电影中文日韩| 麻豆一区二区三区精品视频| 翔田千里一区二区| 亚洲va久久久噜噜噜| 三级小视频在线观看| 欧美极品aⅴ影院| www.九色.com| 国产毛片精品久久| 亚洲黄色片网站| 免费91在线观看| 一本色道久久综合亚洲精品不卡 | 大美女一区二区三区| 欧美极品视频一区二区三区| 精品国产丝袜高跟鞋| 欧美日韩在线影院| 特黄特黄一级片| 成人激情视频| 91sa在线看| aa视频在线免费观看| 国产丝袜欧美中文另类| 国产91沈先生在线播放| 九七影院97影院理论片久久| 亚洲国产成人久久| 黄色录像一级片| 久热精品在线| 极品校花啪啪激情久久| 黄色网在线看| 欧美视频一区二区在线观看| 日韩综合第一页| 伊人久久大香线| 国产精品高清免费在线观看| 天天综合天天色| 亚洲自拍偷拍网站| 国产精品自在自线| 成人免费看片39| 全亚洲最色的网站在线观看| 日本精品999| 亚洲国产色一区| 久久久久亚洲av片无码v| 日韩精品不卡一区二区| 国产精品成人va在线观看| 亚州视频一区二区三区| 亚洲一区二区三区自拍| 精品无码av一区二区三区不卡| 久久综合99| 国产欧美va欧美va香蕉在| 韩国中文免费在线视频| 欧美日韩一区二区在线播放| 日本不卡视频一区| 狠狠88综合久久久久综合网| 亚洲永久在线观看| www免费视频观看在线| 欧美精品免费视频| 国产三级aaa| 久久激情综合网| 亚洲欧美综合一区| 日韩免费大片| 久久精品成人欧美大片古装| 91国内精品视频| 中文字幕中文乱码欧美一区二区 | 日本一级黄色大片| 国产成人免费av在线| 日本国产中文字幕| www.神马久久| 欧美亚洲午夜视频在线观看| 亚洲欧美自偷自拍| 一本色道**综合亚洲精品蜜桃冫| 香蕉视频黄色在线观看| 天堂午夜影视日韩欧美一区二区| 奇米影视首页 狠狠色丁香婷婷久久综合| 69久成人做爰电影| 一区二区三欧美| 中文字幕有码视频| 亚洲视频在线观看三级| 亚洲在线观看网站| 亚洲美女视频在线免费观看 | 国产一区二区精品福利地址| 国产精品丝袜白浆摸在线| 欧美日本一道| 欧美成人三级在线| 精品欧美一区二区三区免费观看| 久久久久国产精品麻豆| 超碰在线播放91| 欧美日韩视频| 久久久综合亚洲91久久98| 色香欲www7777综合网| 精品国产一区二区三区久久狼黑人 | 头脑特工队2免费完整版在线观看 头脑特工队2在线播放 | 久久久久99| 亚洲一区精彩视频| 中文字幕一区日韩精品| 91chinesevideo永久地址| av播放在线| 老司机免费视频一区二区| 亚洲日本无吗高清不卡| 亚洲精品午夜| 国产99久久精品一区二区永久免费 | 久久久久人妻一区精品色欧美| 成人国产亚洲欧美成人综合网| 国产免费毛卡片| 久久精品免费一区二区三区| 久久国产精品久久| www一区二区三区| 91精品国产91久久久久久吃药| 91露出在线| 精品电影一区二区三区 | 图片区小说区亚洲| 亚洲欧美制服综合另类| av老司机久久| 在线欧美日韩精品| 免费中文字幕在线观看| 国产无一区二区| 国产a级片视频| 欧美aaaaaa午夜精品| av在线播放亚洲| 日韩午夜电影网| 免费在线一区二区| 亚洲综合网站| 国产精品自产拍高潮在线观看| 国产精品偷拍| 美日韩丰满少妇在线观看| 电影在线一区| 日韩电影网在线| 亚洲AV无码一区二区三区性| 欧美日韩视频在线第一区| 日韩经典在线观看| 亚洲免费电影在线| 国产精品美女高潮无套| 99re66热这里只有精品3直播| 中文字幕剧情在线观看| 日韩av中文字幕一区二区三区 | 青青草原国产在线| 日韩在线视频免费观看高清中文| 无码精品在线观看| 精品国产凹凸成av人网站| 91麻豆国产视频| 色婷婷综合视频在线观看| 日本在线小视频| 亚洲一区二区三区国产| 在线观看美女av| 国产精品久久久久国产精品日日| 国产av自拍一区| 91香蕉国产在线观看软件| 国产在线不卡av| 国产激情一区二区三区| 奇米777在线视频| 看片的网站亚洲| www.超碰97.com| 老司机精品视频在线| 99热一区二区| 久久99久久99| 一级淫片在线观看| 国模少妇一区二区三区| 男人午夜视频在线观看| 韩国成人精品a∨在线观看| 九九热精品在线播放| 极品少妇xxxx偷拍精品少妇| 不卡的av中文字幕| 久久99久久久欧美国产| 免费不卡av网站| 国产成人欧美日韩在线电影| 免费观看一区二区三区| 成人综合在线观看| 欧美大片免费播放器| 99久久99久久精品免费观看| 亚洲第九十七页| 久久久一区二区三区| 免费看污片的网站| 国产精品视频一二| 日本免费网站视频| 一区二区日韩av| 日本熟妇成熟毛茸茸| 欧美日韩国产页| 69亚洲精品久久久蜜桃小说| 欧美亚男人的天堂| 国产又大又黄又爽| 欧美成人精品3d动漫h| 天天射天天色天天干| 国产一区av在线| 成人看av片| 91禁外国网站| 久久91视频| 成人欧美一区二区三区在线观看| 久久香蕉精品香蕉| 日韩免费一区二区三区| 91精品啪在线观看国产18 | 国产一级久久| 污污的视频免费| 成人手机在线视频| 人妻一区二区视频| 一区二区在线观看免费 | 精品白丝av| 国产天堂在线播放| 国产一区二区三区免费| 国产精品300页| 国产精品白丝在线| 日本午夜精品理论片a级app发布| 91成人免费在线视频| 国产毛片毛片毛片毛片毛片| 亚洲国产成人91精品| av免费在线一区二区三区| 欧美久久精品一级黑人c片| 午夜裸体女人视频网站在线观看| 国产美女被下药99| 欧美成人一区在线观看| 亚洲人成网站在线观看播放| 亚洲黄色在线| 国产乱码一区二区三区四区| 久久色成人在线| 久久精品99久久久久久| 欧美少妇xxx| 婷婷国产在线| 久久成人免费视频| 欧美日韩亚洲国产| 精选一区二区三区四区五区| 我不卡影院28| 久久久精品麻豆| 99国产欧美另类久久久精品| 国产免费久久久久| 91福利国产成人精品照片| 风流少妇一区二区三区91| 色妞久久福利网| 二区三区不卡| 精品免费国产| 红桃视频亚洲| 午夜视频在线观| 国产精品嫩草影院av蜜臀| 黄色在线免费观看| 亚洲国产欧美一区二区三区久久| 国产在线观看免费麻豆| 国产精品香蕉国产| 欧美最新另类人妖| 免费在线观看日韩视频| 成人黄色在线看| 精品无码av在线| 日韩欧美你懂的| dj大片免费在线观看| 国产免费一区二区三区在线能观看| 中文字幕伦av一区二区邻居| 成人午夜免费在线| 高清在线不卡av| 免费中文字幕视频| 日韩午夜精品视频| 最新超碰在线| 亚洲综合在线小说| 欧美国产激情| 国内av免费观看| 一区二区三区在线影院| av中文在线观看| 欧美成人精品影院| 国产一区2区在线观看| 中文字幕在线乱| 国产一区二区美女| 欧美精品一区二区蜜桃| 欧美一二三区精品| 成人在线观看亚洲| 91香蕉国产在线观看| 亚洲网色网站| 中国老熟女重囗味hdxx| 亚洲在线观看免费| 熟妇高潮一区二区高潮| 69视频在线播放| 亚洲精品亚洲人成在线观看| 日韩视频在线免费看| 欧美激情一区在线| 97在线视频人妻无码| 九色成人免费视频| 欧美日韩另类图片| 大肉大捧一进一出好爽动态图| 国产三级精品三级| 一级全黄裸体免费视频| 久久久av一区| 大香伊人久久精品一区二区| 少妇av一区二区三区无码| 91婷婷韩国欧美一区二区| 国产亚洲欧美日韩高清| 色诱女教师一区二区三区| 欧美另类中文字幕| 拔插拔插海外华人免费| 久久久久久99久久久精品网站| 免费黄色一级大片| 欧美裸体男粗大视频在线观看| 国产精品极品| 亚洲天堂av线| 亚洲精品高清视频在线观看| 亚洲人成色777777老人头| 国产精品美女久久久免费| 欧美成人一品| 丰满少妇在线观看资源站| 欧美日韩中文字幕一区| 人人澡人人添人人爽一区二区| 精品一区久久久久久| 美女精品自拍一二三四| 国产亚洲精品久久久久久打不开| 亚洲免费伊人电影在线观看av| 婷婷久久免费视频| 国产特级黄色大片| 国产精品久久久久毛片软件| 欧美 日韩 国产 成人 在线 91| 日韩av成人在线| 欧美视频四区| 成人黄色免费网址| 亚洲国产精品久久久| 欧美日韩卡一|