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

從零實現一個Promise

開發
Promise其實就是一個類,內部有state、value、reason等屬性,分別用于存儲當前Promise的狀態、執行成功后的返回值,執行失敗的原因,同時內部還提供了resolve、reject兩個方法,這兩個方法會以參數的形式傳遞給執行器,即傳遞到外部,以便修改Promise的狀態。

[[343707]]

一、Promise/A+ 規范
① Promise 是一個類或者函數,內部擁有3個狀態,分別為pending(等待)、fulfilled(執行、完成)、rejected(拒絕、未完成)。

默認為pending狀態,即Promise對象剛創建的時候狀態為pending,并且pending狀態可以轉換fulfilled或者rejected。

fulfilled和rejected為最終的狀態,一旦變為fulfilled或者rejected,那么將無法轉變為其他狀態。

② Promise需要對外提供一個then方法。

  1. promise.then(onFulfilled, onRejected) 

如果可選參數onFulfilled和onRejected不為函數時應該被忽略;

onFulfilled和onRejected函數都應該是異步執行的;

當調用 onFulfilled 函數時,會將當前 Promise 的值作為參數傳入,并且只能調用一次;

當調用 onRejected 函數時,會將當前 Promise 的失敗原因作為參數傳入,并且只能調用一次;

then函數的返回值仍然為Promise,以便進行鏈式調用;

③ resolvePromisethen方法會創建并返回一個Promise對象,then中注冊的回調函數會返回各種值,必須進行校驗。

then方法返回的promise不能與then中回調函數返回值x相等,否則需要拋出錯誤;

如果是then回調函數返回值為一個非Promise對象,則直接用then返回的promise對象的resolve方法,resolve(x)即可。

如果then回調函數返回值x為一個Promise對象或者一個帶then方法的對象或函數,那么需要執行其then方法注冊回調,拿到Promise或類Promise對象的值作為then返回的promise的值,如果值仍然為Promise對象則需要進行遞歸操作;

二、實現Promise
① 根據第一條規范,Promise是一個類或者函數,所以我們先將Promise定義成一個類,同時內部有三個狀態,我們將其定義為常量。

  1. var PENDING = "pending"; // 等待狀態 
  2. var FULFILLED = "fulfilled"; // 執行、完成狀態 
  3. var REJECTED = "rejected"; // 拒絕、未完成狀態 
  4. class Promise { 
  5.     constructor() { 
  6.         this.state = PENDING; // Promise對象創建完成后默認為等待狀態 
  7.     } 

② 我們在創建Promise的時候會傳入一個函數,該函數會在創建Promise對象的時候立即執行,并且會接收兩個參數,分別用于執行或拒絕當前Promise對象,即修改當前Promise對象的狀態。Promise是用于處理異步的,所以在Promise狀態變為完成的時候可能會接收到異步操作執行的結果,在Promise狀態變為未完成的時候可能會接收到失敗的原因,所以Promise內部還需要保存異步操作的結果value、失敗的原因reason。

 

  1. ...... 
  2. class Promise { 
  3.     constructor(executor) { // 傳入執行器函數 
  4.         ...... 
  5.         this.value = undefined; // 保存異步操作的結果 
  6.         this.reason = undefined; // 保存失敗的原因 
  7.         const resolve = (value) => { 
  8.             this.value = value; 
  9.             this.state = FULFILLED; // 將Promise對象的狀態改為完成狀態 
  10.         } 
  11.         const reject = (reason) => { 
  12.             this.reason = reason; 
  13.             this.state = REJECTED; // 將Promise對象的狀態改為未完成狀態 
  14.         } 
  15.         try { 
  16.             executor(resolve, reject); // 執行器由用戶傳入可能會發生錯誤,所以需要進行捕獲 
  17.         } catch(e) { 
  18.             reject(e); 
  19.         } 
  20.     } 

③ 這里還存在一個問題,就是Promise必須是單次執行的,Promise的狀態一旦從pending狀態修改為fulfilled或者rejected,就不能再發生變化,從fulfilled變為fulfilled也不可以,也就是說resolve或者reject只能執行一次。所以我們需要對resolve和reject內部進行判斷,如果狀態已經變化了則不再執行了,如:

  1. ...... 
  2. class Promise { 
  3.     constructor(executor) { // 傳入執行器函數 
  4.         ...... 
  5.         const resolve = (value) => { 
  6.             if (this.state === PENDING) { // 防止用戶多次resolve,以第一次resolve為準 
  7.                 ...... 
  8.             } 
  9.         } 
  10.         const reject = (reason) => { 
  11.             if (this.state === PENDING) { // 防止用戶多次reject 
  12.                 ...... 
  13.             } 
  14.         } 
  15.         ...... 
  16.     } 

④ 給Promise添加一個then函數,then函數接收onFulfilled, onRejected兩個函數作為參數,分別用于處理Promise完成時和未完成時的回調函數,如果不是函數,則要進行初始化為一個函數,如:

  1. class Promise { 
  2.     then(onFulfilled, onRejected) { 
  3.         onFulfilled = typeof onFulfilled === "function" ? onFulfilled : (value) => { // 如果onFulfilled不是函數,則初始化一個完成處理函數 
  4.             return value; 
  5.         }; 
  6.         onRejected = typeof onRejected === "function" ? onRejected : (reason) => { // 如果onRejected不是函數,則初始化一個未完成處理函數 
  7.             throw reason; // 傳什么就拋出什么 
  8.         } 
  9.     } 

⑤ then方法其實就是一個注冊回調的過程,當調用then的這個Promise對象的狀態變為完成狀態就可以執行onFulfilled回調函數,當Promise對象的狀態變為拒絕狀態就可以執行onRejected回調函數了。所以回調函數的執行依賴于調用then的Promise的狀態。同時為了支持鏈式調用,then方法還需要返回一個Promise對象。根據前面的Promise規范,傳入的回調函數必須異步執行,這里用setTimeout進行模擬。

  1. class Promise { 
  2.     then(onFulfilled, onRejected) { 
  3.         ...... 
  4.         let promise; 
  5.         switch(this.state) { 
  6.             case FULFILLED: // 調用then方法的時候,當前Promise狀態已經變成完成狀態,則可用立即執行完成的回調函數 
  7.                 promise = new Promise((resolve, reject) => { 
  8.                     setTimeout(() => { 
  9.                         try { 
  10.                             let x = onFulfilled(this.value); 
  11.                         } catch(e) { 
  12.                             console.log(e); // 打印錯誤信息 
  13.                             reject(e); 
  14.                         } 
  15.                     }); 
  16.                 }); 
  17.                 break; 
  18.             case REJECTED: 
  19.                 promise = new Promise((resolve, reject) => { 
  20.                     setTimeout(() => { 
  21.                         try { 
  22.                             let x = onRejected(this.reason); 
  23.                         } catch(e) { 
  24.                             reject(e); 
  25.                         } 
  26.                     }); 
  27.                 } 
  28.                 break; 
  29.             case PENDING: 
  30.                 promise = new Promise((resolve, reject) => { 
  31.                     // TODO 
  32.                 }); 
  33.                 break; 
  34.         } 
  35.         return promise; 
  36.     } 

⑥ 當調用then的Promise對象處于pending狀態的時候,此時通過then注冊的回調函數不能立即執行,必須等待Promise的狀態變為最終狀態才能執行注冊的回調函數。這里就涉及到了一個發布訂閱模式。我們可以先將回調函數保存起來,那么什么時候Promise才會變成最終狀態呢?那就是調用resolve或reject的時候,所以我們可以在調用resolve或reject的時候,取出注冊的回調函數然后執行即可。

  1. class Promise { 
  2.     constructor(executor) { 
  3.         const resolve = (value) => { 
  4.             if (this.state === PENDING) { // 防止用戶多次resolve,以第一次resolve為準 
  5.                 ...... 
  6.                 this.onFulfilleds.forEach(fn => fn()); // 取出then中注冊的完成回調函數并執行 
  7.             } 
  8.         }; 
  9.         const reject = (reason) => { 
  10.             if (this.state === PENDING) { // 防止用戶多次reject 
  11.                 ...... 
  12.                 this.onRejecteds.forEach(fn => fn()); // 取出then中注冊的拒絕回調函數并執行 
  13.             } 
  14.         }; 
  15.     } 
  16.     then(onFulfilled, onRejected) { 
  17.         ...... 
  18.         switch(this.state) { 
  19.             case PENDING: 
  20.                 promise = new Promise((resolve, reject) => { 
  21.                     this.onFulfilleds.push(() => { 
  22.                         try { 
  23.                             let x = onFulfilled(this.value); 
  24.                         } catch(e) { 
  25.                             console.log(e); // 打印錯誤信息 
  26.                             reject(e); 
  27.                         } 
  28.                     }); 
  29.                     this.onRejecteds.push(() => { 
  30.                         try { 
  31.                             let x = onRejected(this.reason); 
  32.                         } catch(e) { 
  33.                             reject(e); 
  34.                         } 
  35.                     }); 
  36.                 }); 
  37.                 break; 
  38.         } 
  39.     } 

⑦ 接下來就是要處理then注冊的回調函數的返回值了,因為回調函數的返回值可能是各種各樣的情況,可能是普通的值,可能是Promise對象,也可能是帶then方法的對象,所以我們要一一進行處理。這里我們使用一個單獨的方法resolvePromise()進行各種情況的處理,如:

  1. // 傳入then()方法中創建的Promise對象,回調函數的返回值x,then()方法中創建的Promise的resolve、reject 
  2. const resolvePromise = function(promise, x, resolve, reject) { 
  3.     // TODO 
  4. class Promise { 
  5.     constructor(executor) { // 傳入執行器函數 
  6.         ...... 
  7.     } 
  8.     then(onFulfilled, onRejected) { 
  9.         case FULFILLED: 
  10.             promise = new Promise((resolve, reject) => { 
  11.                 ...... 
  12.                 let x = onFulfilled(this.value); 
  13.                 resolvePromise(promise, x, resolve, reject); // 處理回調函數的返回值 
  14.             }); 
  15.         case REJECTED: 
  16.             promise = new Promise((resolve, reject) => { 
  17.                 ...... 
  18.                 let x = onRejected(this.reason); 
  19.                 resolvePromise(promise, x, resolve, reject); // 處理回調函數的返回值 
  20.             }); 
  21.         case PENDING: 
  22.             this.onFulfilleds.push(() => { 
  23.                 let x = onFulfilled(this.value); 
  24.                 resolvePromise(promise, x, resolve, reject); // 處理回調函數的返回值 
  25.             }); 
  26.             this.onRejecteds.push(() => { 
  27.                 let x = onRejected(this.reason); 
  28.                 resolvePromise(promise, x, resolve, reject); // 處理回調函數的返回值 
  29.             }); 
  30.     } 

三、實現resolvePromise
① 如果回調函數返回值與then()方法中創建的Promise對象相同則拋出錯誤,這相當于是自己等自己會進入死循環。

  1. let p1 = new Promise((resolve, reject) => { 
  2.     resolve(1); 
  3. }) 
  4. let p2 = p1.then((value) => { // p2即then方法內創建Promise對象 
  5.     return p2; 
  6. }); 
  7. // 結果拋出錯誤,顯示Chaining cycle detected for promise #<Promise> 

  1. const resolvePromise = function(promise, x, resolve, reject) { 
  2.     if (promise === x) { // 禁止resolve自己 
  3.         throw new Error("Chaining cycle detected for promise #<Promise>"); 
  4.     } 

② 如果回調函數返回的是一個Promise對象或者帶then方法的類Promise對象,又或者一個函數,因為函數上也可能有then方法,那么我們需要取出then方法并執行,對于Promise對象而言,then方法的執行就會注冊相應的回調函數,等Promise狀態變為最終狀態后就會執行對應的回調函數,回調函數執行后就可以拿到Promise對象的value值,然后將該value值作為調用then方法創建的Promise的對象的value值。

  1. const resolvePromise = function(promise, x, resolve, reject) { 
  2.     ...... 
  3.     if ((x && typeof x === "object") || typeof x === "function") { // 如果是對象或者函數,函數也可能有then方法 
  4.         let executed; 
  5.         try { 
  6.             let then = x.then; // 嘗試取出then方法 
  7.             if (typeof then === "function") { // 如果該對象上存在then方法,那么是個Promise對象或者包含then方法的對象 
  8.                 then.call(x, function (y) { // 執行then方法,對于真正的Promise對象,則會注冊回調,等到狀態變化后,回調函數會執行,回調中能接收到Promise的value值 
  9.                     if (executed) return
  10.                     executed = true; // 注冊的回調函數只能執行一次 
  11.                     resolvePromise(promise, y, resolve, reject); // 返回值還可能是一個Promise對象,故需要遞歸直到變為普通值為止 
  12.                 }, function (e) { 
  13.                     if (executed) return
  14.                     executed = true
  15.                     reject(e); 
  16.                 }); 
  17.             } else { // 不包含then方法的普通對象,直接resolve即可 
  18.                 resolve(x);       
  19.             } 
  20.         } catch(e) { 
  21.             if (executed) return
  22.             executed = true
  23.             reject(e); 
  24.         } 
  25.     } else { 
  26.         resolve(x); 
  27.     } 

四、實現catch
catch可以看做是一個特殊的then方法,其內部會調用then()方法,但是僅注冊拒絕的回調函數,這也就是then(onFulfilled, onRejected)和then(onFulfilled).catch(onRejected)的區別,如果將onRejected寫到then中,那么當then的onFulfilled發生錯誤的時候,onRejected就無法捕獲到其中的錯誤,而寫到catch中,那么就相當于是下一個then()方法,故能捕獲到上一個then()方法中發生的錯誤。

  1. class Promise { 
  2.     catch(onRejected) { 
  3.         return this.then(null, onRejected); // 僅注冊拒絕的回調函數 
  4.     } 

五、總結
Promise其實就是一個類,內部有state、value、reason等屬性,分別用于存儲當前Promise的狀態、執行成功后的返回值,執行失敗的原因,同時內部還提供了resolve、reject兩個方法,這兩個方法會以參數的形式傳遞給執行器,即傳遞到外部,以便修改Promise的狀態。

Promise還提供了一個then方法用于注冊回調函數,注冊回調的時候與當前Promise的狀態有關,如果是最終狀態,則立即執行,如果是等待狀態,則先保存起來,等到調用resolve或reject方法的時候再取出回調并執行。注冊的回調函數可能會返回各種各樣的值:

如果返回的是普通值,那么直接用then返回的Promise的resolve方法resolve即可;

如果返回的是Promise對象或者是帶then方法的對象或函數,那么需要調用其then方法并注冊一個自定義回調用于接收當前Promise的值,等該Promise變為最終狀態后會執行回調就可以拿到其value,最后將其作為then返回的Promise的value,即resolve(x)。完整源碼如下:

  1. var PENDING = "pending"; // 等待狀態 
  2. var FULFILLED = "fulfilled"; // 執行、完成狀態 
  3. var REJECTED = "rejected"; // 拒絕、未完成狀態 
  4. // 傳入then()方法中創建的Promise對象,回調函數的返回值x,then()方法中創建的Promise的resolve、reject 
  5. const resolvePromise = function(promise, x, resolve, reject) { 
  6.     if (promise === x) { // 禁止resolve自己 
  7.         throw new Error("Chaining cycle detected for promise #<Promise>"); 
  8.     } 
  9.     if ((x && typeof x === "object") || typeof x === "function") { // 如果是對象或者函數,函數也可能有then方法 
  10.         let executed; 
  11.         try { 
  12.             let then = x.then; // 嘗試取出then方法 
  13.             if (typeof then === "function") { // 如果該對象上存在then方法,那么是個Promise對象或者包含then方法的對象 
  14.                 then.call(x, function (y) { // 執行then方法,對于真正的Promise對象,則會注冊回調,等到狀態變化后,回調函數會執行,回調中能接收到Promise的value值 
  15.                     if (executed) return
  16.                     executed = true; // 注冊的回調函數只能執行一次 
  17.                     resolvePromise(promise, y, resolve, reject); // 返回值還可能是一個Promise對象,故需要遞歸直到變為普通值為止 
  18.                 }, function (e) { 
  19.                     if (executed) return
  20.                     executed = true
  21.                     reject(e); 
  22.                 }); 
  23.             } else { // 不包含then方法的普通對象,直接resolve即可 
  24.                 resolve(x); 
  25.             } 
  26.         } catch(e) { 
  27.             if (executed) return
  28.             executed = true
  29.             reject(e); 
  30.         } 
  31.     } else { 
  32.         resolve(x); 
  33.     } 
  34. class Promise { 
  35.     constructor(executor) { // 傳入執行器函數 
  36.         this.state = PENDING; // Promise對象創建完成后默認為等待狀態 
  37.         this.value = undefined; // 保存異步操作的結果 
  38.         this.reason = undefined; // 保存失敗的原因 
  39.         this.onFulfilleds = []; // 保存then中注冊的完成回調函數 
  40.         this.onRejecteds = []; // 保存then中注冊的拒絕回調函數 
  41.         const resolve = (value) => { 
  42.             if (this.state === PENDING) { // 防止用戶多次resolve,以第一次resolve為準 
  43.                 this.value = value; 
  44.                 this.state = FULFILLED; // 將Promise對象的狀態改為完成狀態 
  45.                 this.onFulfilleds.forEach(fn => fn()); // 取出then中注冊的完成回調函數并執行 
  46.             } 
  47.         }; 
  48.         const reject = (reason) => { 
  49.             if (this.state === PENDING) { // 防止用戶多次reject 
  50.                 this.reason = reason; 
  51.                 this.state = REJECTED; // 將Promise對象的狀態改為未完成狀態 
  52.                 this.onRejecteds.forEach(fn => fn()); // 取出then中注冊的拒絕回調函數并執行 
  53.             } 
  54.         }; 
  55.         try { 
  56.             executor(resolve, reject); // 執行器由用戶傳入可能會發生錯誤,所以需要進行捕獲 
  57.         } catch(e) { 
  58.             reject(e); 
  59.         } 
  60.     } 
  61.     then(onFulfilled, onRejected) { 
  62.         onFulfilled = typeof onFulfilled === "function" ? onFulfilled : (value) => { // 如果onFulfilled不是函數,則初始化一個完成處理函數 
  63.             return value; 
  64.         }; 
  65.         onRejected = typeof onRejected === "function" ? onRejected : (reason) => { // 如果onRejected不是函數,則初始化一個未完成處理函數 
  66.             throw reason; // 傳什么就拋出什么 
  67.         } 
  68.         let promise; 
  69.         switch(this.state) { 
  70.             case FULFILLED: // 調用then方法的時候,當前Promise狀態已經變成完成狀態,則可用立即執行完成的回調函數 
  71.                 promise = new Promise((resolve, reject) => { 
  72.                     setTimeout(() => { 
  73.                         try { 
  74.                             let x = onFulfilled(this.value); 
  75.                             resolvePromise(promise, x, resolve, reject); 
  76.                         } catch(e) { 
  77.                             console.log(e); 
  78.                             reject(e); 
  79.                         } 
  80.                     }); 
  81.                 }); 
  82.                 break; 
  83.              case REJECTED: 
  84.                 promise = new Promise((resolve, reject) => { 
  85.                     setTimeout(() => { 
  86.                         try { 
  87.                             let x = onRejected(this.reason); 
  88.                             resolvePromise(promise, x, resolve, reject); 
  89.                         } catch(e) { 
  90.                             reject(e); 
  91.                         } 
  92.                     }); 
  93.                 }); 
  94.                 break; 
  95.             case PENDING: 
  96.                 promise = new Promise((resolve, reject) => { 
  97.                     this.onFulfilleds.push(() => { 
  98.                         try { 
  99.                             let x = onFulfilled(this.value); 
  100.                             resolvePromise(promise, x, resolve, reject); 
  101.                         } catch(e) { 
  102.                             reject(e); 
  103.                         } 
  104.                     }); 
  105.                     this.onRejecteds.push(() => { 
  106.                         try { 
  107.                             let x = onRejected(this.reason); 
  108.                             resolvePromise(promise, x, resolve, reject); 
  109.                         } catch(e) { 
  110.                             reject(e); 
  111.                         } 
  112.                     }); 
  113.                 }); 
  114.                 break; 
  115.             } 
  116.         return promise; 
  117.     } 
  118.     catch(onRejected) { 
  119.         return this.then(null, onRejected); // 僅注冊拒絕的回調函數 
  120.     } 

 

 

 

 

責任編輯:姜華 來源: 晨曦大前端
相關推薦

2019-04-24 15:06:37

Http服務器協議

2021-06-30 07:19:36

網絡安全

2021-08-04 05:49:40

數據庫數時序數據庫技術

2021-04-27 08:31:37

Promisereject信息

2021-04-28 08:21:21

Promise.any服務器場景

2014-09-25 09:51:29

Android App個人博客

2016-09-14 17:48:44

2019-06-10 15:00:27

node命令行前端

2025-10-24 10:41:33

2025-01-03 09:00:00

代碼C++gTest

2025-05-22 06:44:23

2019-06-12 08:23:21

數據庫時間序列開源

2020-11-06 08:43:21

AIOps運維DevOps

2024-05-20 01:10:00

Promise變量

2019-08-26 09:25:23

RedisJavaLinux

2022-11-08 15:14:17

MyBatis插件

2025-10-24 10:34:55

2025-02-10 07:30:00

malloc內存分配器內存

2025-06-13 09:40:45

2025-06-17 08:10:00

智能指針C++代碼
點贊
收藏

51CTO技術棧公眾號

亚洲熟妇av一区二区三区漫画| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲色偷偷色噜噜狠狠99网| 久久电影tv| 国产精品毛片a∨一区二区三区| 91成人理论电影| 精品不卡一区二区| 中文字幕人成人乱码| 日韩av在线影院| www.久久av.com| 亚洲淫成人影院| 亚洲美女在线一区| 欧美精品七区| 亚洲欧美另类视频| 蜜臀a∨国产成人精品| 国模叶桐国产精品一区| 992在线观看| 美女一区2区| 91精品国产美女浴室洗澡无遮挡| 亚洲熟妇av一区二区三区漫画| 快射av在线播放一区| 9色porny自拍视频一区二区| 成人免费午夜电影| 蜜臀精品一区二区三区| 黄色在线一区| 久久精品一区中文字幕| 国产精品高清无码在线观看| 99这里只有精品视频| 欧美精品丝袜中出| 播放灌醉水嫩大学生国内精品| 成人福利网站| 国产精品久久久久久久岛一牛影视 | 久久丫精品久久丫| 66久久国产| 最近2019年日本中文免费字幕| 免费a v网站| 日韩视频1区| 3d成人动漫网站| 欧美女同在线观看| 日韩三区免费| 色综合久久久久综合体桃花网| 国产玉足脚交久久欧美| 日本在线观看大片免费视频| 亚洲视频一二三区| 亚洲欧洲一二三| av在线播放网站| 久久九九99视频| 欧美综合77777色婷婷| 日韩精品视频无播放器在线看| 成人免费毛片嘿嘿连载视频| 北条麻妃高清一区| 精品人妻一区二区三区三区四区| 黑人精品欧美一区二区蜜桃 | 久热精品在线视频| 国产黄色小视频网站| 午夜国产一区二区| y97精品国产97久久久久久| 大胸美女被爆操| jlzzjlzz亚洲女人| 日韩日本欧美亚洲| 午夜精品福利在线视频| 中文精品电影| 久久久之久亚州精品露出| 国产无精乱码一区二区三区| av不卡免费看| 日韩av手机在线观看| 人人妻人人爽人人澡人人精品| 久久久久久亚洲精品杨幂换脸| 日韩av免费看| 一区二区www| 国产精一品亚洲二区在线视频| 97免费资源站| 深夜福利视频网站| 国产调教视频一区| 亚洲第一页在线视频| 手机av免费在线| 欧美日韩性生活视频| 韩国中文字幕av| 久久久精品区| 亚洲精品二三区| 69精品无码成人久久久久久| 999久久久亚洲| 欧美激情综合亚洲一二区| 日韩欧美大片在线观看| 日韩制服丝袜av| 91免费视频网站| 欧美一区二区在线观看视频| 国产欧美日韩不卡免费| 超碰在线免费观看97| 678在线观看视频| 欧美综合亚洲图片综合区| 天堂av在线8| 国产主播性色av福利精品一区| 亚洲天堂av在线免费观看| 国产精品精品软件男同| 亚洲精品欧美| 91久久夜色精品国产网站| 嫩草影院一区二区| 国产精品久久影院| aa在线观看视频| 伊人亚洲精品| 精品小视频在线| 国产探花在线免费观看| 噜噜噜91成人网| 97av影视网在线观看| 国产香蕉在线| 亚洲成人免费观看| 青青草原播放器| 少妇一区二区视频| 久久久人成影片一区二区三区观看| wwwwww在线观看| a在线欧美一区| 警花观音坐莲激情销魂小说| 欧美人与性动交xxⅹxx| 精品欧美黑人一区二区三区| 亚洲欧洲综合网| 久久久久国产精品午夜一区| 产国精品偷在线| 毛片免费不卡| 欧美在线观看禁18| 黄瓜视频污在线观看| 亚洲青色在线| 99在线首页视频| 高清全集视频免费在线| 欧美性猛交xxxx黑人交| 女同毛片一区二区三区| 亚洲视频一二| www久久99| √天堂8在线网| 5月丁香婷婷综合| 中国特黄一级片| 日韩国产成人精品| 欧美性大战久久久久| 国产污视频在线播放| 欧美r级在线观看| 日韩视频中文字幕在线观看| 久久精品国产99| 亚洲一区三区在线观看| 国产精品久久久久久久久免费高清| 亚洲天天在线日亚洲洲精| 伊人中文字幕在线观看| 久久亚洲综合av| 各处沟厕大尺度偷拍女厕嘘嘘| 精品资源在线| 4k岛国日韩精品**专区| 图片区 小说区 区 亚洲五月| 亚洲国产日韩在线一区模特| 久久久久亚洲AV成人网人人小说| 亚洲欧美亚洲| 9a蜜桃久久久久久免费| 激情影院在线| 亚洲精品一区二区三区蜜桃下载| 免费日韩在线视频| 成人av在线播放网站| 欧美一级欧美一级| 欧美色图婷婷| 国产va免费精品高清在线观看| 男人天堂网在线观看| 91精品福利视频| 日韩免费av一区| 国产一区二区三区久久久| 蜜桃视频一区二区在线观看| 成人知道污网站| 98精品在线视频| 玖玖综合伊人| 欧美精品欧美精品系列| 欧美三级 欧美一级| 99免费精品在线| 色一情一乱一伦一区二区三区日本| 欧洲杯足球赛直播| 91色精品视频在线| 2021天堂中文幕一二区在线观| 亚洲精品美女久久| 午夜一区二区三区四区| 亚洲欧洲三级电影| 亚洲中文字幕无码一区| 久久综合九色综合欧美狠狠| 亚洲色图自拍| 都市激情亚洲欧美| 国产精品美乳一区二区免费| 在线观看h网| 日韩激情第一页| 一卡二卡在线观看| 天天影视网天天综合色在线播放 | 国产精品久久午夜夜伦鲁鲁| 女人扒开腿免费视频app| 亚洲深夜影院| 公共露出暴露狂另类av| 日韩影视在线观看| 成人黄色午夜影院| 中文在线资源| 欧美成人精品在线观看| 免费福利在线观看| 日韩欧美亚洲国产另类| 免费黄色片视频| 亚洲在线视频网站| 五月激情四射婷婷| 成熟亚洲日本毛茸茸凸凹| www.天天射.com| 一道本一区二区| 法国空姐在线观看免费| 亚洲男人都懂第一日本| 91九色蝌蚪成人| 亚洲成av在线| 久久久爽爽爽美女图片| 国产在线观看a视频| 亚洲色图美腿丝袜| 全部免费毛片在线播放一个| 欧美日韩一卡二卡三卡 | 香蕉av777xxx色综合一区| 亚洲图色在线| 欧美猛男同性videos| 成人区精品一区二区| 青青国产精品| 国产97在线观看| 人狥杂交一区欧美二区| 蜜臀久久99精品久久久无需会员 | 免费激情视频在线观看| 亚洲精品日本| 大胆欧美熟妇xx| 91精品动漫在线观看| 亚洲国产精品综合| 欧美久久精品一级c片| 久久国产精品高清| 极品国产人妖chinesets亚洲人妖| 成人网在线免费观看| 日韩一区二区三区免费视频| 欧美综合第一页| 久久男人天堂| 91黄色8090| 成人黄色动漫| 午夜精品一区二区三区在线播放 | 国产黑丝一区二区| 成人午夜激情影院| 第一页在线视频| 国产精品亚洲综合一区在线观看| 亚洲欧美日韩三级| 久久国产精品99精品国产 | 国产成人综合在线| 992tv人人草| 国产一区二区三区综合| 亚洲欧美一区二区三区不卡| 国产久卡久卡久卡久卡视频精品| 午夜大片在线观看| 国产成人在线视频网站| 久久精品一卡二卡| 国产高清久久久久| 国产精品嫩草69影院| 成人免费毛片高清视频| 成人手机在线免费视频| 久久亚区不卡日本| 伊人影院综合网| 国产精品久久久久国产精品日日| 国产wwwwxxxx| 亚洲精品欧美综合四区| 久久久精品视频在线| 亚洲一级二级三级在线免费观看| 天天操天天射天天爽| 欧美视频一二三| 天堂免费在线视频| 欧美久久免费观看| 99在线观看精品视频| 精品福利二区三区| 黄视频在线观看免费| 上原亚衣av一区二区三区| а√天堂在线官网| 久久久这里只有精品视频| 中文字幕在线看片| 国产精品自拍视频| 深夜福利一区| 久久人人九九| 成人vr资源| 久久这里只有精品18| 天堂久久久久va久久久久| 午夜视频在线网站| 成人免费毛片aaaaa**| 亚洲 小说 欧美 激情 另类| 国产精品第五页| 国产亚洲小视频| 在线视频国产一区| av无码精品一区二区三区宅噜噜| 亚洲国产精品va在线看黑人动漫| 九色在线播放| 欧美日韩福利视频| 欧美极品影院| 999国产在线| jlzzjlzz亚洲女人| youjizz.com在线观看| 美女精品网站| 国产免费a级片| 国产精品美女久久福利网站| 免费视频网站www| 在线观看成人免费视频| www.xxxx国产| 一区二区三区视频在线| 久色国产在线| 国产一区二区香蕉| 网红女主播少妇精品视频| 日韩精品一区二区三区电影| 亚洲欧美高清| 免费黄色a级片| 亚洲天堂2014| 亚洲婷婷久久综合| 亚洲精品不卡在线| 一区二区三区伦理| 国产精品日韩久久久久| 国产乱人伦丫前精品视频| 中文字幕一区二区三区四区五区 | 欧美在线一级视频| 日韩免费成人| 在线观看成人av电影| 久久资源在线| 一区二区三区免费在线观看视频| 一区二区在线观看视频在线观看| 亚洲第一区av| 亚洲色图50p| 秋霞伦理一区| 国产一区高清视频| 激情五月***国产精品| 久久久久久久久久毛片| 中文字幕高清不卡| 亚洲黄网在线观看| 亚洲精品久久久一区二区三区| 在线观看中文| 91传媒在线免费观看| 97精品国产福利一区二区三区| 亚洲爆乳无码专区| 成人做爰免费视频免费看| 国产91网红主播在线观看| 美女网站色精品尤物极品姐弟| 人妻互换免费中文字幕| 国产乱理伦片在线观看夜一区| 无码人妻精品中文字幕 | 久久久亚洲国产天美传媒修理工| 国产日韩中文在线中文字幕| 一区不卡字幕| 精品一区免费av| 日本高清一二三区| 91精品国产综合久久香蕉麻豆 | 国产欧美日韩在线观看视频| 精品一卡二卡三卡| 久久久久久久一区| 五月婷婷激情视频| 亚洲欧美日韩区| 激情亚洲影院在线观看| 亚洲人成77777| 韩国成人福利片在线播放| 日本二区三区视频| 91.成人天堂一区| 成人福利网站| 国产高清自拍99| 国产精品腿扒开做爽爽爽挤奶网站| 精品中文字幕在线播放| 色综合网站在线| 成年人免费在线视频| 国产日韩欧美中文| 欧美在线91| 毛茸茸free性熟hd| 一本到不卡精品视频在线观看| 国产三级视频在线播放线观看| 欧美一区二区三区精品| 国产视频123区| 在线观看不卡视频| 黄色的网站在线观看| av在线不卡一区| 午夜亚洲视频| 99re6热在线精品视频| 禁久久精品乱码| 亚洲一区二区中文字幕在线观看| 亚洲精品国产精华液| 日韩永久免费视频| 日韩av日韩在线观看| 久久精品青草| www国产视频| 欧美一a一片一级一片| 顶级网黄在线播放| 久久精品国产精品国产精品污| 日韩制服丝袜先锋影音| 日韩在线观看视频一区二区| 亚洲精品一区二区三区在线观看 | 欧美日韩国产综合草草| www.久久ai| 欧美一二三区| 国产精品99久久久久久久vr| 国产成人精品一区二三区| 中文字幕日韩精品在线观看| 高清日韩欧美| 91小视频网站| 婷婷久久综合九色综合绿巨人| 国模精品一区二区| 国产精品一区二区免费| 蜜桃一区二区三区四区| 日本一区二区三区四区五区| 中文字幕精品一区久久久久| 凹凸成人在线| 在线观看日本www| 在线观看亚洲专区| 91福利在线尤物| 中文字幕一区二区三区精彩视频| 91女人视频在线观看|