国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

帶你寫出符合Promise/A+規(guī)范Promise的源碼

共 13441字,需瀏覽 27分鐘

 ·

2020-07-24 22:20

Promise是前端面試中的高頻問題,如果你能根據(jù)PromiseA+的規(guī)范,寫出符合規(guī)范的源碼,那么我想,對于面試中的Promise相關的問題,都能夠給出比較完美的答案。

我的建議是,對照規(guī)范多寫幾次實現(xiàn),也許第一遍的時候,是改了多次,才能通過測試,那么需要反復的寫,我已經(jīng)將Promise的源碼實現(xiàn)寫了不下七遍,不那么聰明的話,當然需要更加努力啦~

56ef9e7b8537576e2b62bd1a3db13d1d.webp

Promise的源碼實現(xiàn)

/**
?*?1.?new?Promise時,需要傳遞一個?executor?執(zhí)行器,執(zhí)行器立刻執(zhí)行
?*?2.?executor?接受兩個參數(shù),分別是?resolve?和?reject
?*?3.?promise?只能從?pending?到?rejected,?或者從?pending?到?fulfilled
?*?4.?promise?的狀態(tài)一旦確認,就不會再改變
?*?5.?promise?都有?then?方法,then?接收兩個參數(shù),分別是?promise?成功的回調?onFulfilled,?
?*??????和?promise?失敗的回調?onRejected
?* 6. 如果調用 then 時,promise已經(jīng)成功,則執(zhí)行 onFulfilled,并將promise的值作為參數(shù)傳遞進去。
?*??????如果promise已經(jīng)失敗,那么執(zhí)行 onRejected, 并將 promise 失敗的原因作為參數(shù)傳遞進去。
?*??????如果promise的狀態(tài)是pending,需要將onFulfilled和onRejected函數(shù)存放起來,等待狀態(tài)確定后,再依次將對應的函數(shù)執(zhí)行(發(fā)布訂閱)
?*?7.?then?的參數(shù)?onFulfilled?和?onRejected?可以缺省
?*?8.?promise?可以then多次,promise?的then?方法返回一個?promise
?*?9.?如果?then?返回的是一個結果,那么就會把這個結果作為參數(shù),傳遞給下一個then的成功的回調(onFulfilled)
?*?10.?如果?then?中拋出了異常,那么就會把這個異常作為參數(shù),傳遞給下一個then的失敗的回調(onRejected)
?*?11.如果?then?返回的是一個promise,那么會等這個promise執(zhí)行完,promise如果成功,
?*???就走下一個then的成功,如果失敗,就走下一個then的失敗
?*/


const?PENDING?=?'pending';
const?FULFILLED?=?'fulfilled';
const?REJECTED?=?'rejected';
function?Promise(executor)?{
????let?self?=?this;
????self.status?=?PENDING;
????self.onFulfilled?=?[];//成功的回調
????self.onRejected?=?[];?//失敗的回調
????//PromiseA+?2.1
????function?resolve(value)?{
????????if?(self.status?===?PENDING)?{
????????????self.status?=?FULFILLED;
????????????self.value?=?value;
????????????self.onFulfilled.forEach(fn?=>?fn());//PromiseA+?2.2.6.1
????????}
????}

????function?reject(reason)?{
????????if?(self.status?===?PENDING)?{
????????????self.status?=?REJECTED;
????????????self.reason?=?reason;
????????????self.onRejected.forEach(fn?=>?fn());//PromiseA+?2.2.6.2
????????}
????}

????try?{
????????executor(resolve,?reject);
????}?catch?(e)?{
????????reject(e);
????}
}

Promise.prototype.then?=?function?(onFulfilled,?onRejected)?{
????//PromiseA+?2.2.1?/?PromiseA+?2.2.5?/?PromiseA+?2.2.7.3?/?PromiseA+?2.2.7.4
????onFulfilled?=?typeof?onFulfilled?===?'function'???onFulfilled?:?value?=>?value;
????onRejected?=?typeof?onRejected?===?'function'???onRejected?:?reason?=>?{?throw?reason?};
????let?self?=?this;
????//PromiseA+?2.2.7
????let?promise2?=?new?Promise((resolve,?reject)?=>?{
????????if?(self.status?===?FULFILLED)?{
????????????//PromiseA+?2.2.2
????????????//PromiseA+?2.2.4?---?setTimeout
????????????setTimeout(()?=>?{
????????????????try?{
????????????????????//PromiseA+?2.2.7.1
????????????????????let?x?=?onFulfilled(self.value);
????????????????????resolvePromise(promise2,?x,?resolve,?reject);
????????????????}?catch?(e)?{
????????????????????//PromiseA+?2.2.7.2
????????????????????reject(e);
????????????????}
????????????});
????????}?else?if?(self.status?===?REJECTED)?{
????????????//PromiseA+?2.2.3
????????????setTimeout(()?=>?{
????????????????try?{
????????????????????let?x?=?onRejected(self.reason);
????????????????????resolvePromise(promise2,?x,?resolve,?reject);
????????????????}?catch?(e)?{
????????????????????reject(e);
????????????????}
????????????});
????????}?else?if?(self.status?===?PENDING)?{
????????????self.onFulfilled.push(()?=>?{
????????????????setTimeout(()?=>?{
????????????????????try?{
????????????????????????let?x?=?onFulfilled(self.value);
????????????????????????resolvePromise(promise2,?x,?resolve,?reject);
????????????????????}?catch?(e)?{
????????????????????????reject(e);
????????????????????}
????????????????});
????????????});
????????????self.onRejected.push(()?=>?{
????????????????setTimeout(()?=>?{
????????????????????try?{
????????????????????????let?x?=?onRejected(self.reason);
????????????????????????resolvePromise(promise2,?x,?resolve,?reject);
????????????????????}?catch?(e)?{
????????????????????????reject(e);
????????????????????}
????????????????});
????????????});
????????}
????});
????return?promise2;
}

function?resolvePromise(promise2,?x,?resolve,?reject)?{
????let?self?=?this;
????//PromiseA+?2.3.1
????if?(promise2?===?x)?{
????????reject(new?TypeError('Chaining?cycle'));
????}
????if?(x?&&?typeof?x?===?'object'?||?typeof?x?===?'function')?{
????????let?used;?//PromiseA+2.3.3.3.3?只能調用一次
????????try?{
????????????let?then?=?x.then;
????????????if?(typeof?then?===?'function')?{
????????????????//PromiseA+2.3.3
????????????????then.call(x,?(y)?=>?{
????????????????????//PromiseA+2.3.3.1
????????????????????if?(used)?return;
????????????????????used?=?true;
????????????????????resolvePromise(promise2,?y,?resolve,?reject);
????????????????},?(r)?=>?{
????????????????????//PromiseA+2.3.3.2
????????????????????if?(used)?return;
????????????????????used?=?true;
????????????????????reject(r);
????????????????});

????????????}else{
????????????????//PromiseA+2.3.3.4
????????????????if?(used)?return;
????????????????used?=?true;
????????????????resolve(x);
????????????}
????????}?catch?(e)?{
????????????//PromiseA+?2.3.3.2
????????????if?(used)?return;
????????????used?=?true;
????????????reject(e);
????????}
????}?else?{
????????//PromiseA+?2.3.3.4
????????resolve(x);
????}
}

module.exports?=?Promise;

有專門的測試腳本可以測試所編寫的代碼是否符合PromiseA+的規(guī)范。

首先,在promise實現(xiàn)的代碼中,增加以下代碼:

Promise.defer?=?Promise.deferred?=?function?()?{
????let?dfd?=?{};
????dfd.promise?=?new?Promise((resolve,?reject)?=>?{
????????dfd.resolve?=?resolve;
????????dfd.reject?=?reject;
????});
????return?dfd;
}

安裝測試腳本:

npm?install?-g?promises-aplus-tests

如果當前的promise源碼的文件名為promise.js

那么在對應的目錄執(zhí)行以下命令:

promises-aplus-tests?promise.js

promises-aplus-tests中共有872條測試用例。以上代碼,可以完美通過所有用例。

對上面的代碼實現(xiàn)做一點簡要說明(其它一些內容注釋中已經(jīng)寫得很清楚):

  1. onFulfilled 和 onFulfilled的調用需要放在setTimeout,因為規(guī)范中表示: onFulfilled or onRejected must not be called until the execution context stack contains only platform code。使用setTimeout只是模擬異步,原生Promise并非是這樣實現(xiàn)的。

  2. 在 resolvePromise 的函數(shù)中,為何需要usedd這個flag,同樣是因為規(guī)范中明確表示: If both resolvePromise and rejectPromise are called, or multiple calls to the same argument are made, the first call takes precedence, and any further calls are ignored. 因此我們需要這樣的flag來確保只會執(zhí)行一次。

  3. self.onFulfilled 和 self.onRejected 中存儲了成功的回調和失敗的回調,根據(jù)規(guī)范2.6顯示,當promise從pending態(tài)改變的時候,需要按照順序去指定then對應的回調。

PromiseA+的規(guī)范(翻譯版)

PS: 下面是我翻譯的規(guī)范,供參考

術語

  1. promise 是一個有then方法的對象或者是函數(shù),行為遵循本規(guī)范

  2. thenable 是一個有then方法的對象或者是函數(shù)

  3. value 是promise狀態(tài)成功時的值,包括 undefined/thenable或者是 promise

  4. exception 是一個使用throw拋出的異常值

  5. reason 是promise狀態(tài)失敗時的值

要求

2.1 Promise States

Promise 必須處于以下三個狀態(tài)之一: pending, fulfilled 或者是 rejected

2.1.1 如果promise在pending狀態(tài)
2.1.1.1?可以變成?fulfilled?或者是?rejected
2.1.2 如果promise在fulfilled狀態(tài)
2.1.2.1?不會變成其它狀態(tài)

2.1.2.2?必須有一個value
2.1.3 如果promise在rejected狀態(tài)
2.1.3.1?不會變成其它狀態(tài)

2.1.3.2?必須有一個promiserejectreason

概括即是:promise的狀態(tài)只能從pending變成fulfilled,或者從pending變成rejected.promise成功,有成功的value.promise失敗的話,有失敗的原因

2.2 then方法

promise必須提供一個then方法,來訪問最終的結果

promise的then方法接收兩個參數(shù)

promise.then(onFulfilled,?onRejected)
2.2.1 onFulfilled 和 onRejected 都是可選參數(shù)
2.2.1.1?onFulfilled?必須是函數(shù)類型

2.2.1.2?onRejected?必須是函數(shù)類型
2.2.2 如果 onFulfilled 是函數(shù):
2.2.2.1?必須在promise變成?fulfilled?時,調用?onFulfilled,參數(shù)是promisevalue
2.2.2.2?在promise的狀態(tài)不是?fulfilled?之前,不能調用
2.2.2.3?onFulfilled?只能被調用一次
2.2.3 如果 onRejected 是函數(shù):
2.2.3.1?必須在promise變成?rejected?時,調用?onRejected,參數(shù)是promisereason
2.2.3.2?在promise的狀態(tài)不是?rejected?之前,不能調用
2.2.3.3?onRejected?只能被調用一次
2.2.4 onFulfilled 和 onRejected 應該是微任務
2.2.5 onFulfilled ?和 onRejected 必須作為函數(shù)被調用
2.2.6 then方法可能被多次調用
2.2.6.1?如果promise變成了?fulfilled態(tài),所有的onFulfilled回調都需要按照then的順序執(zhí)行
2.2.6.2?如果promise變成了?rejected態(tài),所有的onRejected回調都需要按照then的順序執(zhí)行
2.2.7 then必須返回一個promise
promise2?=?promise1.then(onFulfilled,?onRejected);
2.2.7.1?onFulfilled?或?onRejected?執(zhí)行的結果為x,調用?resolvePromise
2.2.7.2?如果?onFulfilled?或者?onRejected?執(zhí)行時拋出異常e,promise2需要被reject
2.2.7.3?如果?onFulfilled?不是一個函數(shù),promise2?以promise1的值fulfilled
2.2.7.4?如果?onRejected?不是一個函數(shù),promise2?以promise1reason?rejected

2.3 resolvePromise

resolvePromise(promise2, x, resolve, reject)

2.3.1 如果 promise2 和 x 相等,那么 reject promise with a TypeError
2.3.2 如果 x 是一個 promsie
2.3.2.1?如果xpending態(tài),那么promise必須要在pending,直到?x?變成?fulfilled?or?rejected.
2.3.2.2?如果?x?被?fulfilled,?fulfill?promise?with?the?same?value.
2.3.2.3?如果?x?被?rejected,?reject?promise?with?the?same?reason.
2.3.3 如果 x 是一個 object 或者 是一個 function
2.3.3.1?let?then?=?x.then.
2.3.3.2?如果?x.then?這步出錯,那么?reject?promise?with?e?as?the?reason..
2.3.3.3?如果?then?是一個函數(shù),then.call(x,?resolvePromiseFn,?rejectPromise)
????2.3.3.3.1?resolvePromiseFn 的?入?yún)⑹?y, 執(zhí)行 resolvePromise(promise2, y, resolve, reject);
????2.3.3.3.2?rejectPromise 的?入?yún)⑹?r, reject promise with?r.
????2.3.3.3.3?如果 resolvePromise 和 rejectPromise 都調用了,那么第一個調用優(yōu)先,后面的調用忽略。
????2.3.3.3.4?如果調用then拋出異常e?
????????2.3.3.3.4.1?如果?resolvePromise?或?rejectPromise?已經(jīng)被調用,那么忽略
????????2.3.3.3.4.3?否則,reject?promise?with?e?as?the?reason
2.3.3.4?如果?then?不是一個function.?fulfill?promise?with?x.
2.3.4 如果 x 不是一個 object 或者 function,fulfill promise with x.

Promise的其他方法

雖然上述的promise源碼已經(jīng)符合PromiseA+的規(guī)范,但是原生的Promise還提供了一些其他方法,如:

  1. Promise.resolve()

  2. Promise.reject()

  3. Promise.prototype.catch()

  4. Promise.prototype.finally()

  5. Promise.all()

  6. Promise.race()

下面具體說一下每個方法的實現(xiàn):

Promise.resolve

Promise.resolve(value) 返回一個以給定值解析后的Promise 對象.

  1. 如果 value 是個 thenable 對象,返回的promise會“跟隨”這個thenable的對象,采用它的最終狀態(tài)

  2. 如果傳入的value本身就是promise對象,那么Promise.resolve將不做任何修改、原封不動地返回這個promise對象。

  3. 其他情況,直接返回以該值為成功狀態(tài)的promise對象。

Promise.resolve?=?function?(param)?{
????????if?(param?instanceof?Promise)?{
????????return?param;
????}
????return?new?Promise((resolve,?reject)?=>?{
????????if?(param?&&?typeof?param?===?'object'?&&?typeof?param.then?===?'function')?{
????????????setTimeout(()?=>?{
????????????????param.then(resolve,?reject);
????????????});
????????}?else?{
????????????resolve(param);
????????}
????});
}

thenable對象的執(zhí)行加 setTimeout的原因是根據(jù)原生Promise對象執(zhí)行的結果推斷的,如下的測試代碼,原生的執(zhí)行結果為: 20 ?400 ?30;為了同樣的執(zhí)行順序,增加了setTimeout延時。

測試代碼:

let?p?=?Promise.resolve(20);
p.then((data)?=>?{
????console.log(data);
});


let?p2?=?Promise.resolve({
????then:?function(resolve,?reject)?{
????????resolve(30);
????}
});

p2.then((data)=>?{
????console.log(data)
});

let?p3?=?Promise.resolve(new?Promise((resolve,?reject)?=>?{
????resolve(400)
}));
p3.then((data)?=>?{
????console.log(data)
});

Promise.reject

Promise.reject方法和Promise.resolve不同,Promise.reject()方法的參數(shù),會原封不動地作為reject的理由,變成后續(xù)方法的參數(shù)。

Promise.reject?=?function?(reason)?{
????return?new?Promise((resolve,?reject)?=>?{
????????reject(reason);
????});
}

Promise.prototype.catch

Promise.prototype.catch 用于指定出錯時的回調,是特殊的then方法,catch之后,可以繼續(xù) .then

Promise.prototype.catch?=?function?(onRejected)?{
????return?this.then(null,?onRejected);
}

Promise.prototype.finally

不管成功還是失敗,都會走到finally中,并且finally之后,還可以繼續(xù)then。并且會將值原封不動的傳遞給后面的then.

Promise.prototype.finally?=?function?(callback)?{
????return?this.then((value)?=>?{
????????return?Promise.resolve(callback()).then(()?=>?{
????????????return?value;
????????});
????},?(err)?=>?{
????????return?Promise.resolve(callback()).then(()?=>?{
????????????throw?err;
????????});
????});
}

Promise.all

Promise.all(promises) 返回一個promise對象

  1. 如果傳入的參數(shù)是一個空的可迭代對象,那么此promise對象回調完成(resolve),只有此情況,是同步執(zhí)行的,其它都是異步返回的。

  2. 如果傳入的參數(shù)不包含任何 promise,則返回一個異步完成.

  3. promises 中所有的promise都promise都“完成”時或參數(shù)中不包含 promise 時回調完成。

  4. 如果參數(shù)中有一個promise失敗,那么Promise.all返回的promise對象失敗

  5. 在任何情況下,Promise.all 返回的 promise 的完成狀態(tài)的結果都是一個數(shù)組

Promise.all?=?function?(promises)?{
????promises?=?Array.from(promises);//將可迭代對象轉換為數(shù)組
????return?new?Promise((resolve,?reject)?=>?{
????????let?index?=?0;
????????let?result?=?[];
????????if?(promises.length?===?0)?{
????????????resolve(result);
????????}?else?{
????????????function?processValue(i,?data)?{
????????????????result[i]?=?data;
????????????????if?(++index?===?promises.length)?{
????????????????????resolve(result);
????????????????}
????????????}
????????????for?(let?i?=?0;?i???????????????????//promises[i]?可能是普通值
??????????????????Promise.resolve(promises[i]).then((data)?=>?{
????????????????????processValue(i,?data);
????????????????},?(err)?=>?{
????????????????????reject(err);
????????????????????return;
????????????????});
????????????}
????????}
????});
}

測試代碼:

var?promise1?=?new?Promise((resolve,?reject)?=>?{
????resolve(3);
})
var?promise2?=?42;
var?promise3?=?new?Promise(function(resolve,?reject)?{
??setTimeout(resolve,?100,?'foo');
});

Promise.all([promise1,?promise2,?promise3]).then(function(values)?{
??console.log(values);?//[3,?42,?'foo']
},(err)=>{
????console.log(err)
});

var?p?=?Promise.all([]);?//?will?be?immediately?resolved
var?p2?=?Promise.all([1337,?"hi"]);?//?non-promise?values?will?be?ignored,?but?the?evaluation?will?be?done?asynchronously
console.log(p);
console.log(p2)
setTimeout(function(){
????console.log('the?stack?is?now?empty');
????console.log(p2);
});

Promise.race

Promise.race函數(shù)返回一個 Promise,它將與第一個傳遞的 promise 相同的完成方式被完成。它可以是完成( resolves),也可以是失?。╮ejects),這要取決于第一個完成的方式是兩個中的哪個。

如果傳的參數(shù)數(shù)組是空,則返回的 promise 將永遠等待。

如果迭代包含一個或多個非承諾值和/或已解決/拒絕的承諾,則 Promise.race 將解析為迭代中找到的第一個值。

Promise.race?=?function?(promises)?{
????promises?=?Array.from(promises);//將可迭代對象轉換為數(shù)組
????return?new?Promise((resolve,?reject)?=>?{
????????if?(promises.length?===?0)?{
????????????return;
????????}?else?{
????????????for?(let?i?=?0;?i?????????????????Promise.resolve(promises[i]).then((data)?=>?{
????????????????????resolve(data);
????????????????????return;
????????????????},?(err)?=>?{
????????????????????reject(err);
????????????????????return;
????????????????});
????????????}
????????}
????});
}

測試代碼:

Promise.race([
????new?Promise((resolve,?reject)?=>?{?setTimeout(()?=>?{?resolve(100)?},?1000)?}),
????undefined,
????new?Promise((resolve,?reject)?=>?{?setTimeout(()?=>?{?reject(100)?},?100)?})
]).then((data)?=>?{
????console.log('success?',?data);
},?(err)?=>?{
????console.log('err?',err);
});

Promise.race([
????new?Promise((resolve,?reject)?=>?{?setTimeout(()?=>?{?resolve(100)?},?1000)?}),
????new?Promise((resolve,?reject)?=>?{?setTimeout(()?=>?{?resolve(200)?},?200)?}),
????new?Promise((resolve,?reject)?=>?{?setTimeout(()?=>?{?reject(100)?},?100)?})
]).then((data)?=>?{
????console.log(data);
},?(err)?=>?{
????console.log(err);
});

參考

  • Promise A+ 規(guī)范

  • ES6 Promise

  • Promise MDN

學習交流

  • 關注公眾號【前端宇宙】,每日獲取好文推薦
  • 添加微信,入群交流

“在看和轉發(fā)”就是最大的支持
瀏覽 20
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 99在线精品视频免费观看20| 91熊猫视频| 四虎无码| 一区二区三区成人电影| 日本A在线观看| 亚洲AV无码成人精品区久| 黄色污污污网站| 免费18蜜桃久久19| 中文字字幕在线中文乱码电影| 蜜桃久久久亚洲精品| H网站在线观看| 国产又粗又大又爽| WW免费视频| 女神思瑞精品一区二区三区 | 久久大香蕉视频| 蜜臀久久99精品久久久电影| 日韩人妻视频| 精品一区二区久久久久久久网站 | 黄色在线不卡| 女人18片毛片60分钟翻译| 国产精品伦理| 久久大香蕉视频| 婷婷国产亚洲精品网站| 亚洲天堂一区二区三区| 欧美XXX黑人XYX性爽| 成人黄色免费看| BBw日本熟妇BBwHD| 日韩欧美高清在线| 在线观看中文字幕亚洲| 国模一区二区三区| 欧美A级视频在线观看| 成人视频网站18| 亚洲操操操| 五月丁香激情视频| 日本爱爱小视频| 国产三级片自拍| a片免费在线| 免费成人高清视频| 伊人大香蕉视频在线观看| 免费观看一级黄片| 大香蕉色婷婷| 人人操人人看人人干| 激情视频免费看| 国产男女性爱视频播放| 操逼视频在线观看| 99视频免费在线观看| www.久久99| 黄页网站免费在线观看| 农村乱子伦毛片国产乱| 成人做爰黄AA片免费看三区| 青娱乐老视频| 国产一区二区三区在线观看免费视频免费视频免费视频 | 国产在线一| 日本黄色免费在线观看| 天天日av| 亚洲天堂中文| 成人免费视频网站| AV在线资源观看| 91视频电影| 中文字幕亚洲中文字幕| 日韩av一级| 肏逼在线观看| 内射黄片| 午夜精品成人| 特猛特黄AAAAAA片| 青娱乐亚洲精品视频| 无码国产传媒精品一区| 久久久久久国产免费A片| 中出欧美亚洲| 北条麻妃在线播放一区| 蝌蚪窝在线免费观看视频| 韩国中文字幕HD久久精品| 内射午夜福利在线免费观看视频| 老鸭窝毛片| 久久五月婷| 国产乱轮视频| 免费a片在线观看| 婷婷啪啪| 亚洲偷| 激情视频网址| 色婷婷成人做爰A片免费看网站| 在线h片| 91视频免费在线看| 嫩苞又嫩又紧AV无码| 亚洲性爱一区二区三区| 黄色视频在线| 国精品无码人妻一区二区三区免费 | 欧美日韩AV| 婷婷国产精品| sesese| 天堂色综合| 国产精品久久久久久久久久王安宇 | 欧美成人综合一区| 成人自拍视频在线观看| 成人AV十八亚洲二区| 成人国产欧美日韩在线视频| 操逼综合网| 国产三级片在线观看| 日韩无码毛片| 亚洲欧美日韩黑料吃瓜在线观看| 日本在线观看| 九色PORNY国产成人蝌蚪| 国产精品福利在线观看| 最新版本日本亚洲色| 日韩精品一区二区三区免费观看高清 | 色综合久久88色综合| 69成人在线| 日本黄色视频在线免费观看| 亚洲黄色电影网| 水蜜桃网站在线观看| 91AV视频在线| 99热这里精品| 午夜性爱剧场| 国产精品成人午夜福利| h网站在线观看| 北条麻妃视频在线观看| 最近中文字幕高清2019中文字幕| 在线观看黄片| 精品人妻一区二区三区四区 | 91成人看片| 久久久久久久久国产精品| 日韩黄色电影网址| 一区二区高清视频| 亚洲人BBwBBwBBWBBw| 无码中文字幕在线观看| 洞av| 日韩一级爱爱| 水果派解说AV无码一区| av天堂资源在线| 日韩高清无码观看| 人妻熟女在线| 麻豆三级片在线观看| 精品在线第一页| 日韩中文字幕不卡| 午夜熟睡乱子伦视频| 亚洲成人无码视频| 人人做人人爽| 欧美三级视频在线观看| 91精品一区二区| 国产熟妇| 99热这里| 日韩成人无| AAA级片| 996精品在线| 波多野结衣av一区| 久久97人妻AⅤ无码一区| 亚洲人成人无码.www粉色| 在线免费看黄视频| 人人操人人摸人人看| 国产AV资源网| 国产91精品看黄网站在线观看 | 国产精品免费观看久久久久久久久| 精品成人在线视频| 懂色AV一区二区三区国产中文在线| 久久婷婷婬片A片AAA| 黄色无码av| 精品一区无码| 极品人妻疯狂3p超刺激| 操逼高清无码| 亚洲无码偷拍| 日本少妇高清视频| 91久久久久久久久久久| 91久久久久久久久久| 伊人久久影院| 青娱乐精品视频| 亚洲精品天堂无码AV片| av国产精品| 久久精品国产AV| 色片免费| 亚洲精品免费在线观看| 黄页网址在线观看| 国产乱伦自拍| 91站街农村熟女露脸| 亚洲综合五月天婷婷丁香| 国产亚洲欧美一区二区| 久久艹综合网| 国产在线看片| 99热在线只有精品| 亚洲无码精品久久| 亚洲欧洲免费视频| 996热| 中文字幕无码一区二区| 免费人成视频观看| 国产97在线视频| 丁香五月婷婷五月天| 在线免费观看黄色小视频| 欧美成人激情| 逼逼75大秀| 小黄片在线免费观看| 一本久道无码| 少妇婷婷| 色婷婷在线视频观看| 俺来了俺去了| 欧美性生活| 苍井空在线播放| 国产三级性爱视频| 西西人体44www大胆无码| 嫩BBB槡BBBB槡BBBB撒尿| 日韩福利在线观看| 国产情趣网站| 日韩欧美性爱网站| 亚洲第一成人久久网站| 熟妇女人妻丰满少妇中文字幕 | 成人在线三级片| AV黄色网址| 久久中文视频| 国产精品三级| 学生妹一级大片| 日韩在线你懂的| 熟妇人妻丰满久久久久久久无码 | 国产AV综合网| 日韩人妻无码电影| 成人免看一级a一片A片| 久久青| 九九久久国产精品| 久久久久99精品成人片直播| 国产手机精品视频| 色欲av伊人久久大香线蕉影院| 人成在线免费视频| 日韩综合色视频导航| 青青精品| 在线观看视频国产| 欧美黄色毛片| 亚洲无码视频观看| 国产乱在线| 日本老女人视频| 69久久久| 国产精品久久久久永久免费看| 国产激情视频在线| 日本v片| 日韩AV无码成人精品| 啪啪视频最新地址发布页| 日韩综合一区| 污视频在线观看免费| 97资源在线视频| 国产精品成人无码专区| 国产欧美一区二区三区在线看蜜臀| 免费v片| 欧洲黄色片| A片啪啪| 偷拍亚洲| 激情丁香五月| 先锋资源男人站| 黄在观看线| 午夜不卡视频| 中文字幕在线免费观看| 18禁无码网站| 精品无码一区二区三区免费| 亚洲视频免费看| 日韩中文性受视频| 婷婷无码成人精品俺来俺去| 波多野结衣av中文字幕| 日逼无码| 人妻北条麻妃在线| 丁香激情五月少妇| 另类罕见稀奇videos| 婷婷开心色四房播播在线| 最近中文字幕中文翻译歌词| 婷婷色在线观看| 香蕉视频91| 欧美性之站| 大鸡巴久久久久久久| 人妻少妇一区| 国产精品免费久久影院| 国产精品一区av| 老婆中文字幕乱码中文乱码| 成人AV无码| 无码人妻精品一区二区三区温州| 国产白丝精品91爽爽久久| 久久4| 爱福利视频网| 日韩中文字幕视频在线| 色婷婷成人| 激情乱伦视频| 人妻免费在线视频| 极品久久| 中文字幕的| 熟女人妻人妻の视频| 三级片导航| 大地二中文在线观看免费鲁大师| 久久99精品国产.久久久久| 婷婷色中文网| 亚洲AV无码电影| 中文字幕免费AV| www444www| 无码视频网| 欧美怕怕怕| 影音先锋成人在线资源| 特级西西444www高清| 欧美日韩一区二区三区在线电影| 日韩无码一二三区| 五月天狠狠干| 国产喷水ThePorn| 成人网站在线看。| 天天日天天射天天干| 色综合五月| 激情无码一区二区三区| 色香蕉视频| 国产成人A∨| 精品人妻二区三区蜜桃| 中文字幕日韩人妻| 日韩中文字幕视频在线| 久久久久免费| 曰本精品综合网在线| 亚洲视频福利| 无码免费婬AV片在线观看| 国产在线观看黄| 91国语又粗又大对白| 91成人在线观看学生和老师| 91在线观看网站| 日韩无码免费播放| 欧亚精品视频| 伊人影院久久| 成人无码在线观看免费视频| 少妇厨房愉情理伦BD在线观 | 大香蕉伊人婷婷| 豆花成人社区,视频| 北条麻妃九九九精品视频免费观看| 亚欧洲精品在线视频| 天天干天天撸| 免费的a片| 精品人妻| 五月婷婷色欲| 亚洲国产精品二二三三区| 一区二区亚洲| 成人一区二区在线观看| 热久久久久| 日韩欧美国产成人| 在线观看日韩AV| 国产亚洲欧美一区二区| 草久免费视频| 五月天黄色电影| 美女裸身18禁| 免费一区| 超碰免费视| 2014AV天堂网| 亚洲中文字幕日韩在线| 自拍成人视频| 色欲国产精品欧美在线密| 亚洲精品国产AV婷婷| 国产精品天天干| 国产精品自在线| 超碰人人射| 国产91黄色| av影音在线| 日日操天天操夜夜操| 色情一级AA片免费观看| 国产一级婬女AAAA片季秀英| 日韩专区在线观看| 婷婷在线播放| 翔田千里无码A片| 中文字幕第六页| 黑人aV| 日本免费黄色片| 豆花视频在线播放| 国产精品秘麻豆免费版现看视频| 国产人成视频免费观看| 成人亚洲AV| 国产欧美综合精品| 日韩人妻丝袜中文字幕| 日本高清一区二区高清免费视频 | 亚洲av网站| 2025中文字幕在线| 精品免费国产一区二区三区四区的使用方法 | 日本久久综合网| 久久久亚洲无码| 91久久午夜无码鲁丝片久久人妻| 亚洲啪啪| 四川BBB操BBB| 人妻FrXXeeXXee护士| 亚洲日韩在线a成| 国产成人三级片| 不卡无码免费视频| 正在播放国产精品| 成人做爰100片免费着| 北条麻妃91| 亚洲AV无码成人精品区www| 狠狠干影院| 黑人精品XXX一区一二区| 国产在线观看一区二区| 亚洲AV无码成人精品区www | 久久国产日韩| 全国最大成人网| 欧美一级片免费观看| 男女啪啪免费网站| 97资源在线视频| 精品偷拍| 亚洲中文字幕在线视频播放| 无码日韩精品一区二区免费96| 超碰在线人人爱| 久久这里只有| 俺来也听听婷婷| 欧美操| 亚洲自慰| 亚洲免费精品视频| 人妻精品在线| 三级片网站国产| 日韩综合另类| 大鸡巴伊人| A级无码| 亚洲午夜无码久久久| 国产在线激情视频| 亚洲少妇免费| 日本久久久久久久久视频在线观看| 东北操逼视频| A亚洲天堂| 国产一区二区三区在线观看免费视频免费视频免费视频 | 男人的天堂青青草| 日韩在线一区二区| 草草影院第一页| 精品国产乱码一区二区| 亚洲午夜福利在线| 高清无码高潮| 五月天婷婷在线观看| 日韩高清无码观看| 老女人操逼| 豆花在线视频| 日韩欧美一级A片| 欧美日韩国产一区二区| 超碰青青青| 波多野结衣无码视频| 国产成人精品麻豆| 人人插人人澡| 91乱子伦国产乱子伦海的味道 | 91伊人在线| 日韩美女免费性爱视频| 日韩欧美精品一区二区| 日韩一区二区三区在线视频| 高清无码在线观看18| 精品色哟哟| 国产中文| 91视频国产精品| 久久精品无码一区二区无码性色| 亚洲有码在线播放| 91在线无码精品秘入口电车| 天天射视频| 亚洲AV无码精品久久一区二区| 国产高清视频| 成人大香蕉网站精品免费| 亚洲视频在线观看中文字幕| 九九热在线观看| 日本天堂在线视频| 3级片网站| 青青草激情| 99无码精品| 高清无码在线免费观看| 亚洲黄色视频在线| 亚洲欧美日韩免费| www.色老板| 天天免费视频| 97夜色| AV麻豆| 91久久精品无码一区| 欧美精品无码久久久精品酒店| 丁香五月婷婷六月| 青草视屏| 婷婷伊人綜合中文字幕小说| 亚洲成人无码av| 无码欧美人XXXXX日本无码| 天天爽天天干| 老熟女导航| 免费69视频| 北条麻妃中文字幕在线| 日本无码成人| 天堂视频中文在线| 91视频播放| 国产女主播在线| 炮友五月天| 国产黄色在线视频| 九九九精品在线| 嫩BBB槡BBBB槡BBBB| 操逼操| 亚洲一区二区精品| 日韩一区二区三区四区久久久精品有吗 | 日韩人妻斩| 高清无码视频直接看| 一区在线视频| 欧美一级特黄A片免费| 国产乱子伦一区二区三| 欧美三级视频| 免费a视频在线观看| 91蝌蚪视频在线播放| 麻豆91免费视频| 四虎884| 日日艹夜夜艹| 一本色道久久综合狠狠| 超碰免费97| 日韩免费成人| 国产乱子伦一区二区三| 久久手机电影| 天堂亚洲| 亚洲区一| 亚洲操屄| 91探花足浴店按摩店| 亚洲中文字幕影院| 中文字幕免费在线观看视频| 亚洲精品国产成人无码区在线| 中文字幕亚洲一区| 人人操人人模| 丝袜东京热AV高清| 成人免费无遮挡无码黄漫视频| 国产手机精品视频| 久久久久久久久成人| 亚洲视频区| 亚洲一级黄色视频| 无码乱码在线观看| 国产精品自拍一区| 91国产爽黄在线相亲| 成人片无码| 污视频网站免费在线观看| 日韩黄色电影在线免费观看| 老欧性老太色HD大全| 性爱av天堂| 美女高潮在线| 亚洲精品成人片在线观看精品字幕| 欧美一级黃色A片免费看小优视频| 午夜试看120秒体验区的特点| 岛国AV在线| 少妇bbw搡bbbb搡bbbb| 加勒比操逼| 婷婷乱伦| 欧美日韩中文| 天堂毛片| 亚洲天堂日本| 91国内产香蕉| 成人免费内射视频| 西西人体444大胆高清张悠雨| 伊人大香蕉综合在线| 欧美成人网址在线观看| 免费看AV大片| 欧美性网| 精品人妻一区二区蜜桃视频 | 中文成人无字幕乱码精品区| 亚洲日韩在线看| 欧美一区二区丁香五月天激情| 色婷婷中文字幕| 免费A片在线播放| 国产91无码精品秘入口| 午夜成人亚洲| 中文字字幕在线中文乱码电影| 美女自慰网站免费| 日本精品视频一区二区| 国产成人视频在线播放| 国产AV影视| 91美女视频| 天天操人人| 免费高清无码| 起碰在线视频| 日本高清版色视频| 麻豆国产视频| 91探花视频在线观看| 熟妇高潮| 免费的黄色视频在线观看| www.色在线观看| 操逼在线观看| 四虎884| 大香蕉国产精品视频| 国产在线视频网站| 热久久久久久| 久久久18禁一区二区三区精品| 日本黄色视频免费观看| 啪啪视频最新地址发布页| 大香蕉在线网站| 综合久久视频| 国产午夜影视| 亚洲二区后入极品| 国产久久这里只有精品视频| 91无码在线视频| 国产成人亚洲综合AV婷婷| 最近中文字幕中文翻译歌词| 国产亚洲99久久精品| 国产精品不卡| 老熟女痒到不行-ThePorn| 国产免费AV网站| 午夜精品人妻无码| 男人的天堂aa| 国产精品毛片VA一区二区三区| 精品无码一区二区| 内射免费看| 欧美一二| 亚洲精品久久久久久久久久久| 婷婷无码成人精品俺来俺去| 成人无码日本动漫电影| 亚洲AV无码一区二区三竹菊| 狠久久| 亚洲三级片视频| 精品有码| 精品99999| 一级黄色片网站| 熟女视频网| 一级成人视频| 奇米四色秒播| 波多野结衣高清无码| 久草免费在线| 性爱二区| 欧美18禁网站| 日韩视频中文| 青青草逼视频| 精品三级在线观看| 欧美三区四区| 精品人妻一区二区乱码一区二区| 大香蕉av在线| 成人免费视频18| 九色PORNY9l原创自拍| 2025av天堂网| 亚洲AV中文无码| 台湾久久| 成人精品一区二区三区电影| 欧美性爱第四页| 国产精品无码久久久久成人app | 国产无码AV在线| 国产avwww| 成人理论片| 噜噜噜AV| 特一级黄A片| 丝袜东京热AV高清| 男女操逼视频网站免费| 综合+++夜夜| 在线小视频| 欧美级毛片一进一出| 亚洲色欧美| 狠狠婷婷| 国产又爽又黄免费网站在线看| 国产精品秘久久久久久| 91欧美性爱| 91久久久久久久久久久久18| 97在线免费| 97免费在线视频| 天天操夜夜操视频免费高清| 欧美不卡在线视频| 六月丁香五月天| 一欧美日韩免费/看| 成人黄色免费视频| 九九热九九| 内射学生妹| 搡BBBB搡BBB搡五十| 色色欧美| 在线免费观看黄色电影| 丰滿人妻一区二区三区| 九色国产视频| 三级在线观看视频| 少妇白洁视频| 亚洲香蕉在线视频| 国产毛片在线视频| 99性爱| 欧美亚洲自拍偷拍| 日本成人毛片| 色网站在线| 蜜桃AV无码一区二区三区| 日韩成人免费观看| 天天爽天天摸| 筱田步美| 老太婆擦BBBB撩BBBB| 日韩在线第—页| 中文字幕牛牛婷婷| 精品中文在线| 国产做爰XXXⅩ久久久骚妇| 亚洲婷婷综合网| 亚洲手机在线播放| 欧美午夜性爱视频| 91丝袜在线| 亚洲精品秘一区二区三区影| 高清无码免费观看视频| 啊啊啊啊啊靠逼| 淫香淫色天天影视| 一级黄色视频片| 亚州v| 少妇无码在线| 色老板在线观看视频| 色亭亭影院| 夜夜av| 艹逼在线观看| 亚洲码无人客一区二区三区| 人人射人人爱| 欧美日韩激情视频| 看一级黄色片| 日韩在线中文字幕视频| 久久免费视频播放| 第一福利成人AV导航| 色婷婷在线视频观看| 中国老熟女重囗味HDXX| 蜜臀久久久久久999| 狠狠撸在线观看| 特级av| 日韩激情在线| 国产大鸡吧| 国产一级视频| 亚洲秘AV无码一区二区qq群| 91麻豆福利在线观看| 青吴乐大香蕉| 美日韩A片| 欧美三级不卡| 国产3p绿帽骚妻视频| 日韩欧美天堂| 一区二区三区无码专区| 91麻豆视频在线观看| 成人毛片在线视频| 丁香婷婷激情五月| 99re免费视频| 91香蕉国产在线观看软件| www.17c嫩嫩草色蜜桃网站| 婷婷五月情| 毛片网站在线| 91精品一区| 天天干天天干天天干| 吴梦梦《女教师时间暂停》| AV影院在线| 99er这里只有精品| 97性爱视频| 精品九九九九九| 激情五月俺也去| 久久婷婷国产麻豆91天堂 | 亚洲视频免费在线| 狠狠撸在线观看| 一区二区无码在线| h片在线播放| 丝袜诱惑AV| 国产精品久久久91| 婷婷中文| 在线视频内射| 日韩在线一区二区三区四区| 免费一级大片| 性欧美69| 精品69| 偷拍综合| 无码精品一区| 天天色网站| 高清无码操逼视频| 国产91无码精品秘入口| 青青草小视频| 伊人精品A片一区二区三区| 97日韩| 激情五月丁香五月| 天天日天天色| 夜夜骚精品人妻av一区| 少妇激情网站| 亚洲不卡在线| 久久综合无码内射国产| 激情久久AV一区AV二区AV三区 | 91狠狠色丁香婷婷综合久久| 淫揉BBB揉揉揉BBBBB| 国产精品秘久久久久久免费播放| 国产高清视频在线| 日本成人不卡视频| 夜夜操操| 亚洲无码一级视频| 国产不卡一| 亚洲a级| 亚洲久草| 精品人妻一区二区三区日产| 成人片成人网久久蜜桃臀| 国产三级片网| 国产免费啪啪视频| AⅤ在线观看| 人人草大香蕉| 欧美拍拍视频| 精品福利在线| 2019中文字幕在线| 国产又粗又大又黄视频| 亚洲免费天堂| 蜜臀AV在线播放| 色婷婷一级A片AAA毛片| 怡春院国产| 老司机永久免费91| 最新av网| 色色视频网| 亚洲日韩欧美一区二区天天天| 丁香五月婷婷在线| 日本AV在线播放| 精品一二三区| 干日本少妇| 黄色视频大全在线观看| 91久久人澡人妻人人做人人爽97| 国产口爆在线观看| 久久久久亚洲AV成人网人人软件| 亚洲女人被黑人巨大进入| 成人久久| 日韩99热| 91av一区二区三区| 无码一级二级| 三级久久久| 亚洲福利电影| 九九九九九九国产| 天天操夜夜操狠狠| 美女操B| 一区二区三区成人电影| 蜜桃AV| 91国产福利| 在线观看日本黄| 男人天堂久久| 在线免费观看AV片| 99国产在线| 翔田千里无码视频| 日本A在线播放| 超碰97在线免费| 久久久久久AV| 成人影视亚洲| 中文字幕一区二区三区人妻电影| 风间由美大荫蒂无码AV| 亚洲无码精品一区二区三区| 亚洲中文字幕视频在线观看| 免费一级黄色电影| 狠狠操狠狠色| 欧美黄片一区二区| 欧美丰满美乳XXⅩ高潮www | 欧美成人免费网站| 欧美视频一区二区三区四区| 人妻三级| 欧美精品不卡| 国产婷婷色| 特级444WWW大胆高清| 免费看一级高潮毛片| 黄色视频网站在线播放| 欧洲精品视频在线观看| 免费的黄色视频| 欧美国产日韩欧美亚洲国产| 91人妻人澡| 人人射人人爱| 亚洲欧美另类在线| 一级黄色大毛片| 人人摸人人看人人| 中国国产乱子伦| 一道本AV| 欧美精品成人免费片| 色中色av| 高h网站| 欧美在线一区二区| 成人伦理聚合| 97超碰中文字幕| www.天天射| 中文字幕一区二区三区四区五区| 色中文 | 玖玖爱在线精品视频| 婷婷丁香五月激情| 青青草五月天色婷婷丁香| 国产成人久久777777| 自拍偷拍综合网| 日韩午夜成人| 在线99精品| 黄色无码视频在线观看| 国产足交| 无码视频在线| 欧美日韩中文视频| 一区二区三区久久久久〖网:.〗| 欧美亚洲天堂网| 中文字幕在线观看1| 91成人视频免费观看| 能看的AV网站| wwwav| 国产一精品一aⅴ一免费| 狠狠欧美| 男女午夜福利| 午夜大黄片| 操嫩逼视频| 一级理论片| 蝌蚪九色啦403| 2025无码视频| 99热在线免费| 久久人搡人人玩人妻精AV香蕉| 午夜成人精品一区二区三区| 成年人视频免费看| 四虎视频| 亚州精品成人片| 一级二级三级视频| 天天撸在线视频| 校园春色成人| 亚洲精品视频免费观看| 久久草视频| 俺也去俺也来| 国产高清无码在线观看视频| 亲子乱AⅤ一区二区三区| 九九热播精品| 日韩在线一区二区三区四区| 99久久久久久| 先锋影音资源站av每日资源在线 | 人妻少妇精品视频一区二区三区| 18精品爽国产冫绿帽社| 高清无码一区二区三区四区| 日韩AV三级片| 青青草大香蕉伊人| 久久AV片| 亚洲小电影在线观看| 蜜桃AV无码一区二区三区| 亚洲热在线| 高清无码操逼视频| 黄色视频在线网站| 成人无码在线观看免费视频| 日韩欧美91| 三级片无码在线观看| 青草伊人网| 自拍偷拍视频网| 波多野结衣在线无码| 摸BBB槡BBBB搡BBB,,,,, | 艹逼片| 国产最新视频| 日韩免费在线观看一区入口| 在线观看www视频| 欧美成人猛片AAAAAAA| 欧美成人精品A片免费一区99| 亚洲欧洲精品视频|