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

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

共 29347字,需瀏覽 59分鐘

 ·

2021-09-11 14:27

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

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

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已經成功,則執(zhí)行 onFulfilled,并將promise的值作為參數(shù)傳遞進去。
 *      如果promise已經失敗,那么執(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)做一點簡要說明(其它一些內容注釋中已經寫得很清楚):

  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 被 fulfilledfulfill promise with the same value.
2.3.2.3 如果 x 被 rejectedreject 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, 執(zhí)行 resolvePromise(promise2, y, resolve, reject);
    2.3.3.3.2 rejectPromise 的 入參是 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 已經被調用,那么忽略
        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源碼已經符合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({
    thenfunction(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.length; 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 < promises.length; 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

學習交流

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

最后,希望大家一定要點贊三連。

一個學習編程技術的公眾號。每周推送高質量的優(yōu)秀博文、開源項目、實用工具、面試技巧、編程學習資源等等。目標是做到個人技術與公眾號一起成長。歡迎大家關注,一起進步,走向全棧大佬的修煉之路

“在看和轉發(fā)”就是最大的支持

瀏覽 29
點贊
評論
收藏
分享

手機掃一掃分享

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

手機掃一掃分享

分享
舉報

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

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 欧美夜夜草视频| 91青青草| 国产色五月| 成人无码国产| 日日爱99| 亚洲AV无码一区二区三区少妇| 亚洲视频网| 搡中国东北老女人视频| 亚洲超碰在线观看| 黄片网站入口| 欧美黄片免费视频| 亚洲成人无码视频| 毛片传媒| 91人人视频| 97人妻人人澡人| 99热一区二区三区| 69AV视频网站| 996热| 成人视频一区二区三区| va在线| 狠狠躁日日躁夜夜躁A片男男视频| 男女抽插视频| 日韩大尺度Av| 中文字幕+乱码+中文乱码91| 日韩中文字幕不卡| A视频免费观看| 亚洲A片电影| 欧美午夜影院| jizz在线观看免费视频| 欧美熟女性爱| 亚洲乱妇| 草逼网站| av资源在线播放| 亚洲精品人人| 蜜臀久久99精品久久久久久婷婷| 日本A一级片| 99热中文字幕在线观看| 人妻精品一卡二卡| 色综合99| 亚洲小视频在线观看| 国产无码免费在线观看| 五月天高清无码| 久操超碰| 无码AV电影在线观看| 人操人人人操| 国产女人免费| 亚洲男人综合| 成人免费在线视频| 欧美精品秘一区二区三区蜜臀| 91精品导航| 日韩在线中文字幕视频| 亚洲成人在线无码| 九九人妻| 国产一区二区三区免费观看| 国产白嫩精品久久久久久| AA片免费看| 九七色色电影| 亚洲九九九| 国产精品无码在线观看| 亚洲性爱自拍| 国精品伦一区一区三区有限公司| 精品在线第一页| 日本中文字幕不卡| 一级无码在线观看| 欧美精品一卡二卡| 中文字幕AV第一页| 永久在线| 亚洲免费小电影| 成人黄色一级A片| 亚洲日韩欧美国产| 亚洲AV无码一区二区三区少妇| 色94色.欧美.setu| 超碰199| 天天色视频| 精品偷拍| 广东BBW搡BBBB搡| 欧美性猛交XXXX乱大交蜜桃| 国产淫语| 天天日天天干天天干| 国产成人a亚洲精品无码| 国产精品三级视频| 久久精品苍井空免费一区二| 毛片成人网| 欧美日韩精品一区二区三区视频播放| 国产精品每日更新| 亚洲中文字幕日韩| 国产八区| 日本黄色直播| 精品国产区一区二| 国产视频a| 天天干,夜夜爽| 中韩日美免费看的电影| 国产成人秘在线观看免费网站| 色婷婷综合视频| 韩国成人免费无码免费视频| 日本少妇高潮喷水XXXXXXX| 青草成人在线| 国产婷婷五月| 97人妻一区二区精品免费视频| 欧美性生活视频| 超碰最新在线观看| 国产一区二区三区视频在线| 能看的操逼网站| 翔田千里在线一区二区三区| 成人黄网站免费观看| 91九色精品女同系列| 亚洲国产成人在线| 精品视频中文字幕| 亚洲精品乱码在线| 黄色毛片在线播放| 成年人免费公开视频| 国产精品视频导航| 亚洲一区二区视频在线观看| 国产AV电影网| 国产一级网站| 91人妻人人澡人人添人人爽| 成人毛片18| 成年人黄色视频网站| 天堂a√在线8| 国产精品视频99| 日韩无码成人片| 蜜桃91精品入口| 中国黄色学生妹一级片| 99亚洲视频| 欧洲亚洲视频| 91精品视频网站| 精品国产一区二区三区久久久蜜月 | 人妻精品免费| 蜜桃成人无码区免费视频网站| 婷婷激情视频| 一区二区无码高清| 五月婷亚洲精品AV天堂| 中文字幕精品亚洲熟女| 啊啊啊网站| 亚洲成人网站在线| 国产www| 嫩草在线观看| 日韩人妻无码一区二区三区七区| 天天舔| 无码精品人妻一区二区欧美| 成人才看的在线视频| 日韩中文字幕视频在线| 成人综合在线观看| 麻豆视频一区二区三区| 91AV在线电影| 天堂在线www| 人妻超碰| 在线观看禁无码精品| 91豆花视频| 国产综合久久| 午夜精品久久久久久不卡8050 | 在线观看AV资源| 麻豆传媒在线| 91干逼| 亚洲天堂AV网| 最近2021中文字幕免费| 免费小视频| 欧美性爱视频网站| 综合五月婷婷| 中国老少配BBwBBwBBW| 精品久热| 色香蕉影院| 夜操| 男人天堂2024| 男女午夜福利| 蜜臀AV在线| 四虎国产精品成人久久| 精品人妻一区二区三区日产乱码| 国产婬片lA片www777| 最新毛片网站| 中文字幕成人A片| 婷婷九月| 黄色av免费| 久久久黄色| 国产高清无码片| WW免费视频| 91成人视频免费观看| 超碰极品| 麻豆911| 色噜噜在线| 黄色视频网站免费观看| 淫一区二区| 中国毛片网站| 91一起草高清资源| 2026国产精品视频| 精品乱子伦一区二区三区免费播成 | 第四色激情网| 韩国精品无码一区二区三区18| 亚洲激情综合| 亚洲色777| A级片免费看| 影音先锋在线视频观看| 国产精品久久久精品cos| 久久人人爱| 婷婷操逼| 暴操美女网站| 国产精品资源在线观看| 久久精品无码视频| 亚洲AV无码免费| 欧美偷拍视频| 日本一区二区三区免费看| 高清无码视频在线| 午夜av在线免费观看| 18久久| 美女做爱视频| 色秘乱码一区二区三区| 免看一级a一片| 国产剧情一区二区三区| 欧美黄色A片| 逼逼75大秀| 91视频电影| 97大香蕉在线视频| 国产一区二区成人久久919色| 精品久久久久久久久久| AV免费激情影院| 亚洲中文无码在线观看| 怡春院院成人免费视频| 奇米狠狠操| 欧美性爱中文字幕| 先锋影音一区二区三区| 草久伊人| 99Re66精品免费视频| 激情图区| 欧美日韩免费在线播放电影在线播放电影在线播放电影免费 | 99爱免费视频| 人成视频在线免费观看| 男女av| 日韩无码黄色片| 成人一区二区在线观看| 国产嫩草精品A88AV| 91精品国产欧美一区二区成人| 人妻性爱| 欧美亚洲操逼视频| 亚洲欧美日韩色图| 亚洲久久视频| 黑人av在线观看| 黄色在线不卡| 日韩中文字幕人妻| 免费看成人747474九号视频在线观看 | 欧美乱伦视频| 8x8拨牐拨牐拨牐永久免费| 日韩无码中文字幕视频| 一级黄色电影在线观看| 加勒比DVD手机在线播放观看视频| 欧美男女交配视频| 2026国产精品视频| 在线观看国产免费视频| 农村一级婬片A片| www国产在线| aa久久| 北条麻妃久久| 操操操AV| 国产精品99视频| 五月婷婷深深爱| 美女性爱3P视频| 波多野结衣与黑人| 国产精品在线观看视频| 日韩A级片| 国产婬片一级A片AAA毛片AⅤ| 国产丝袜人妖TS系列| 久久久国产91桃色一区二区三区 | 精品国产AV无码一区二区三区 | 天天色天天干天天日| 成人免费毛片果冻日本| 四川少BBB搡BBB爽爽爽| 青青草国产亚洲精品久久| 超碰免费在线| 久久毛片基地| 久久丝袜视频| 狼人综合网| 11一12周岁女毛片| 中文最新天堂8√| 操逼大片| 日韩在线视频第一页| 欧美成人精品在线| 77Q视频| 91破处网站| 久青草资源福利视频| 日韩无码久久| 日韩第三页| 在线无码中文| 丁香五月激情综合| 高清无码视频免费看| 色色视频在线观看| 成人黄色网| 黄色三级A片| 国产日韩在线视频| 国产中文字幕AV在线播放| 在线播放亚洲无码| 午夜男女福利| 中国A级片| 日韩无码AV一区二区三区| 日本A片视频| 亚洲人成777| 91视频在线网站| 国产一级无码| 亚洲无码中文字幕视频| A在线| 无码东京热国产| 国产在线色| 高清av无码| 精品国产一二三| AV2014天堂网| 欧美A级视频| 免费观看黄片视频| 亚洲成人精品在线| 一级毛AA片| 日本a在线免费观看| 成人福利| 亚洲精品无码中文| 波多野结衣在线网站| 美女性爱3P视频| 色色色色综合| 九九九色| 免费高清无码视频在线观看| 欧美成人网站在线| 国产精品视频在线看| 欧美婬乱片A片AAA毛片地址| 狠狠色婷婷7777| www.jiujiujiu| 四虎精品成人无码A片| 秋霞无码一区二区三区| 抽插免费视频| 欧美卡一卡二| 亚洲AV成人片色在线观看高潮| 欧美日韩在线一区| 国产成人A∨| 欧美另类| 永久免费看A人片无码精| 国外成人性视频免费| 夜夜欢天天干| 人人摸天天| 亚洲精品乱码久久久久久蜜桃91 | 在线综合国产欧美| AV免费网址| 亚洲女人被黑人巨大的原因| 国产91久久婷婷一区二区| 人人摸人人操人人| 一本色道久久88亚洲精品综合| 麻豆激情| 丁香五月亚洲综合| 又黄又爽无遮挡| 亚洲无码一级电影| 免费黄色视频在线| 亚洲欧美日韩在线| 亚洲操逼电影| 韩国毛片| 久草免费福利| 亚洲热视频| 在线观看亚| 黄色AA片| 中文字幕在线视频日本| 在线中文av| 黄色A片网址| 色婷婷一级A片AAA毛片| 蜜桃视频成人版网站| 丁香婷婷五月色成人网站| 欧美性爱一级视频| 亚洲自拍网站| 免费一级婬片AAA片毛片A级 | 国产在线一| 国内老熟妇对白XXXXHD| 日本婷婷| 四虎永久www成人影院| 婷婷五月中文| 另类一区| 国产毛片精品一区二区色欲黄A片| 亚洲第一在线| 免费观看一级毛一片| 日韩黄色电影在线观看| 亚洲精品国产精品国自产网站| 超碰狠狠操| 97人妻一区二区精品视频| 激情五月综合| 一区二区三区电影网| 在线观看免费黄片| 亚洲精选一区二区三区| 东京热久久综合色五月老师 | 国产久久免费视频| 91麻豆精品国产91久久久吃药 | 麻豆午夜福利| 少妇高潮无码| 成人日韩精品| 18国产免费视频在线观看| 三级视频网址| AV三级片在线观看| 黄色av网站免费| 一级A片60分钟免费看| 91色色色色| 欧美性爱小说| 中文字幕在线一区二区a| 亚洲综合激情五月久久| 67194国产| 一级做a爰片毛片A片| 免费看黄色一级片| 亚洲天堂在线观看网站| 国产综合久久777777麻豆| 人人看人人摸人人插| 蜜桃AV在线| 免费爱爱视频网站| 国产高清视频在线观看| 国产久久久久久久久久| 天天天天干| 黄片51| 日韩无码精品AV| 熟妇人妻中文AV无码| 久久久久久久极品内射| 欧洲成人在线| 青青草小视频| 蜜桔视频嫩草蜜桃| 黄色操逼| 嫩BBB搡BBBB搡BBBB| 亚洲人妻少妇| 六月激情丁香| 91老熟女| 久久久蜜桃| 99久久久国产精品免费蜜臀| 日韩熟妇无码中文字幕| 人人摸天天| 国产熟妇搡BBBB搡BBBB毛片| 亚洲自慰| 国产老熟女高潮毛片A片仙踪林 | 一级一级a免一级a做免费线看内裤| 在线观看高清无码视频| 无码成人在线| 亚洲精品国产精品乱码视99 | 色色婷婷五月| 国产免费黄色视频网站| 91精品丝袜久久久久久久久久粉嫩 | 双腿张开被9个男人调教| 激情婷婷五月| 91久久精品无码一区| 欧美日韩一区二区三区在线电影| 国产精品久久久久久久久久久久久久 | 五月天久久久久| 久久91人妻无码精品蜜桃HD| 7777影视电视剧在线观看官网| 无码人妻AV一区| 国产亲子乱A片免费视频| 在线日韩AV| 91国产视频网站| 日本无码在线播放| 波多野结衣一二三区| 精品欧美片在线观看步骤| 一区二区三区免费看| 91日韩高清| 九九色综合| 国产精品免费人成人网站酒店| 99精品一区二区三区| 色女人天堂| 日韩无码中文字幕视频| 日韩AV性爱| 天天色av| 亚洲尤物在线| 日韩一a| 毛片传媒| 久久大鸡巴| 日韩综合不卡| 99久久精品国产一区色| 精品动漫3D一区二区三区免费版| 国产香蕉视频免费| 青青草精品视频| 四川BBB搡BBB爽爽爽电影| WWW.豆花视频精品| 五月丁香激情视频| 天天看毛片| 能看的黄色视频| 久草小视频| 国产精品AV在线观看| 日本操屄视频| 国产又黄又爽| 影音先锋AV在线资源| 99re99热| 日韩在线免费视频| 三级片无码在线观看| 大香蕉在线视频网| 亚洲第一区欧美日韩| 成人激情在线观看| 粉嫩av一区二区白浆| 久久电影无码| 国产白丝在线观看| 免费18禁网站| 女人18片毛片60分钟翻译| 国产乱子伦日B视频| xxxxx日韩| 亚洲成人精品AV| 亚洲av不卡| 国产资源av| 欧美1区2区| 欧美怡红院视频| 久久人人操| 日本熟妇一区二区三区| 中文字幕视频免费| 做爱视频毛片人乱| 免费毛片基地| 欧美肉大捧一进一出小说| 国产亚洲精品久久久波多野结衣 | 一区二区三区Av| 最新精品视频| 日韩人妻精品无码制服| 高清无码第一页| 黄片视频在线免费播放| 亚洲一级无码| 久久99久久99久久99人受| 青青草逼视频| 亚洲色婷婷五月| 亚洲天堂免费视频| 日韩AV在线免费| WWW.99热| 九九色在线视频| 在线免费看黄片| 97人妻精品一区二区三区视频| 欧美性猛交XXXXⅩXX| 中文字幕日韩无码片| 精品人妻无码| 精品探花| 91av一区| 91精品91久久久中77777 | 欧洲精品在线观看| 日韩中文字幕在线观看视频| 性久久久久久久久久| 国产精品夜夜爽3000| 91香蕉视频18| 猛男大粗猛爽H男人味| 青娱乐网站| 欧美性爱内射| 另类老妇奶性生BBwBB| 国产一区二区三区免费视频| AV先锋资源| 偷拍视频图片综合网| 久草新| 免费A片在线观看| 无码人妻精品一区二区蜜桃91| 无码av免费| www.91超碰在线| 欧美国产日韩综合在线观看170| 色哟哟一区二区三区| 99久久99久久久精品棕色圆| 国产精品国产三级囯产普通话2| 大香蕉伊人丁香五月| 欧美日韩国产精品| 永久免费看片视频| 2014av天堂网| 97人妻人人澡人人| 蜜桃精品久久久| 亚洲秘无码一区二区三区观看| 国产精品卡一卡二| 亚洲中文字幕免费在线观看| 日韩人妻系列| 欧美肏屄网| 日本一级一片免费视频| 亚洲天堂2017| 91成人国产| 澳门午夜| a片网站在线观看| 色综合五月| 黄色在线免费看| 你懂的视频网站| 国产精品成人在线观看| 婷婷国产成人精品视频| 亚洲AV久久无码| 国产麻豆电影在线观看| 天天干天天操天天| 亚洲精品乱码久久久久久蜜桃91 | 国产又大又粗又黄| 欧美高清一区二区| 亚洲av小电影| 五月天婷婷乱伦| av在线精品| 91狠狠色丁香婷婷综合久久| 91超碰久久在线| 国产乱子伦一区二区三区免看| 日日夜夜天天综合| 丁香六月操| 欧美偷拍| 欧美草逼视频| 韩日无码视频| 在线18禁| 日韩综合在线观看| 羞羞av| 国产女人18毛片水18精品软件| 日韩欧AV| 大香蕉在线观看视频| 学生妹做爱视频| 丁香婷婷视频| 婷婷国产精品| 婷婷高清无码| 欧美偷拍一区| 黄色视频免费| 91麻豆天美传媒在线| 欧美怡春院| 天天综合色| 超碰操逼| 亚洲欧美精品在线| 91福利在线视频| 三级网站网址| 亚洲黄色一级电影| 国产乱色精品成人免费视频| 五月人妻| 日本无码久久嗯啊流水| 日韩一级在线观看| 无码国产精品一区二区免费式直播 | 亚洲操逼图| 免费无码国产在线观看快色| 欧美午夜视频| 少妇高潮无码| 微熟女地址导航| 亚洲日韩欧美成人| 亚洲秘无码一区二区三区| 无码国产99精品久久久久网站| 熟妇高潮一区二区高潮| 996久久| 怡红影院美乳| 北条麻妃无码| 一级爱爱| 日批视频网站| 人人操人人摸人人| 久久穴| 2025av天堂| 三级片中文| 国产老女人操逼| 午夜av在线免费观看| 亚洲69v久久久无码精品| 欧美日韩肏屄视频| 探花在线| 午夜成人国产| 亚洲AAA电影| 人人草人人搞| 91熊猫视频| 手机在线小视频| 日韩人妻丰满无码区A片| 亚洲综合小说| 午夜激情视频在线观看| 暗呦网一区二区三区| 又紧又嫩又爽无遮挡免费| 日韩精品视频一区二区| 99久久99久久| 久久精品www人人爽人人| 亚洲一区二区AV| 丁香婷婷六月| 草久免费视频| 蝌蚪窝免费视频| 日中文字幕| 澳门午夜| 在线99热| 欧美熟妇BBB搡BBB| 成人无码国产| 精产国品一区二区三区| 99久久久无码国产精品性波多| 国产亚洲精品午夜福利巨大软件| 3D动漫操逼视频| 国产乱子伦真实精品!| av无码av天天av天天爽| 婷婷亚洲五月色综合| 久久久久久久极品内射| 亚洲秘无码一区二区| 久久亚洲AV无码午夜麻豆| 亚洲欧美激情小说另类| 大香蕉伊人电影| 三级av网站| 日韩欧美国产成人| 99精品一区二区三区| 澳门午夜黄色在线| 老鸭窝成人| 国产日韩在线播放| 91久久精品一区二区三区| 美女十八禁| 亚洲日韩在线视频播放| 日韩免费性爱视频| 操女人的网站| 五月天婷婷在线视频| 亚洲无码一级视频| 91一级片| 国产精品码ls字幕影视| 国产性猛交╳XXX乱大交| 国产视频入口| 黄色成人视频免费看| 最新中文字幕av| 国产农村妇女精品一二区| 熟女人妻ThePorn| 毛片成人网| 国产丝袜无码| 一道本高清无码视频| 亚洲AV无码久久精品色无码蜜桃| 色色777| 日韩精品中文字幕无码| 超碰在线看| 久久精品国产亚洲| 精品国产99| 国产成人视频在线观看| 北条麻妃视频在线观看| 日皮视频在线观看| 色骚爽大香蕉91| AV天堂小说| 日韩91在线视频| 天天干天天色天天射| 麻豆黄色电影| 成人黄色AV网站| 欧美aaa在线| 狠狠干狠狠艹| 自拍偷拍影音先锋| 69视频免费观看| 中日韩免费视频| 亚洲精品成a人在线观看| 激情动态视频| 亚洲无码在线电影| 欧美成人黄色电影| 伊人狼人香蕉| 欧美一级夜夜爽| 久了中文字幕| 中国操B视频| 被黑人操| 影音先锋亚洲AV| 免费观看操逼| 日本视频一区二区三区| 最近2021中文字幕免费| 黃色一级A片一級片| 成人精品无码| 看操b视频| 日韩在线1| 天堂av中文字幕| 99热一区二区三区| 无码免费在线观看视频| 久草视频免费看| 影音先锋av资源网站| 日本A片免费看| 91精品久久香蕉国产线看观看| a在线视频| 欧美城综合在线观看网| a三级片| 我要看黄色一级片| 欧美黄色成人视频| 2019国产精品| 亚洲电影无码| 三级a片| 麻豆中文字幕| 欧美撒色逼撒| 中文字幕五月久久婷婷| 91偷拍与自偷拍精品无码| 色色网站在线观看| 色天堂在线观看视频| 欧美在线黄片| AV三级片在线观看| 亚洲偷| 亚洲性精| 十八禁网站在线观看| 少妇人妻一区二区三区| AAA成人| 熟女嗷嗷叫高潮合集91| 亚洲av在线免费观看| 中文字幕视频在线| 色呦呦一欧美| 亚洲成人AV一区二区| 日韩精品无码一区二区三区| 91精品国产一区二区| 青草草在线| 成人视频一区二区| 国产麻豆视频| 亚洲啊V| 国产精品嫩草久久久久yw193| 成人免费A片在线观看直播96| 99久久婷婷国产综合精品漫| 亚洲成人福利| 九九热精品在线| 久久99影院| 2024av在线| 自拍偷拍图区| 淫色五月| 人妻日韩| 久久久成人电影| 国产一区免费观看| 最近中文字幕在线观看| 视色视频在线观看18| 视频一区二区三区免费| 成人在线视频网站| 成人福利小视频| 99在线小视频| 日韩免费三级| 91人人视频| 激情一区二区三区| 日韩无码人妻久久一区二区三区 | 俺来了俺去了| 91日综合欧美| 蝌蚪窝在线视频观看| 欧美亚洲日韩在线观看| 国产一级婬片A片免费无成人黑豆 国产真实露脸乱子伦对白高清视频 | 波多野结衣网址| 婷婷天天干| 日韩激情一区二区| 成人黄色性爱视频| 人人妻人人操人人| 激情无码视频| 欧美A片免费观看| a√天堂资源中文8| 一本久久精品一区二区| 怡红院男人天堂| 成人视频在线观看18| 国产女人18毛片水真多18| 九九热在线精品视频| 俺去俺来也WWW色老板| 黑人无码在线| 日本天堂Tv视频在线观看| 婷婷丁香五月在线| 在线视频污| 91露脸熟女四川熟女在线观看 | 91夜夜夜| 亚洲毛片网站| 亚洲色小说| 日韩高清AV| 成人性在线| 大香蕉最新视频| 搡中国东北老女人视频| 天天天天天天干| 国产三级高清无码| WWW.99热| 九色PORNY蝌蚪视频| 国产乱妇乱子伦视频免费观看| 久久久人妻无码精品蜜桃| 日韩欧美亚洲一区二区三区| 91精品国产aⅴ一区二区| 日韩美女视频19| 亚洲人在线观看| 亚洲av网站在线观看| 草B视频| 丁香六月激情| 你懂的在线视频观看| 成人一区视频| wwwxxx18| 日韩成人精品| 国产精品做爱| 在线观看中文字幕AV| 狠狠撸在线视频| 亚洲AV秘一区二区色盗战流出| 97人妻精品一区二区三区软件| 热久在线| 欧美三级| A视频免费在线观看| 性爱视频小说| 操逼视频免费在线观看| 性爱久久久| 大地影视官网第三页入口| 大黄网站在线观看| 国产一级18片视频| 国产在线观看mv免费全集电视剧大全 | 五月天狠狠干| 黑人av| 在线观看中文字幕无码| 国产小视频在线播放| 亚州成熟少妇视频在线观看| 在线观看无码AV| 日本一本在线| 超碰在线人人操| 伊人网站视频在线| 免费视频99| 久久穴| 火淫玖玖免费精品| 91在线你懂的| 3p绿帽黑人看自己老婆| 国产成人精品视频| 色综合99久久久无码国产精品| 视频一区18| 天堂中文在线观看| 亚洲综合成人在线| 亚l洲视频在线观看| 成人爱爱视频| 亚洲精品久久久久毛片A级牛奶 | 午夜偷拍网站| 九九精品在线视频| 青草视频在线播放| 精品国产成人| 国产黄片免费视频| 日韩精品人妻中文字幕蜜乳| 国产婷婷内射| 婷婷精品在线视频| 国产777777| 欧美日韩三级在线| 日本色视频| 日本无码一区二区| 中文字幕在线观看网| 亚洲黄色视频免费看| 日本黄色电影网站| 久草视频在线免费播放| 最新日韩无码| 黑人AV| 日韩精品无码AV| 国产精品成人无码| 亚洲无码日| 粉嫩99精品99久久久久| www.狠狠| 国产青草视频在线观看| 欧美午夜黄片| 无码视频免费| AA视频网站| 免费乱伦视频| 久久人妻无码中文字幕系列| 天天精品视频| 成人做爰A片一区二区app | 日韩操大屌| 67194国产| 欧美成人黄色电影|