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

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

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

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

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

[[335576]]

Promise的源碼實(shí)現(xiàn) 

  1. /**  
  2.  * 1. new Promise時(shí),需要傳遞一個(gè) executor 執(zhí)行器,執(zhí)行器立刻執(zhí)行  
  3.  * 2. executor 接受兩個(gè)參數(shù),分別是 resolve 和 reject 
  4.  * 3. promise 只能從 pending 到 rejected, 或者從 pending 到 fulfilled  
  5.  * 4. promise 的狀態(tài)一旦確認(rèn),就不會(huì)再改變  
  6.  * 5. promise 都有 then 方法,then 接收兩個(gè)參數(shù),分別是 promise 成功的回調(diào) onFulfilled,   
  7.  *      和 promise 失敗的回調(diào) onRejected  
  8.  * 6. 如果調(diào)用 then 時(shí),promise已經(jīng)成功,則執(zhí)行 onFulfilled,并將promise的值作為參數(shù)傳遞進(jìn)去。  
  9.  *      如果promise已經(jīng)失敗,那么執(zhí)行 onRejected, 并將 promise 失敗的原因作為參數(shù)傳遞進(jìn)去。  
  10.  *      如果promise的狀態(tài)是pending,需要將onFulfilled和onRejected函數(shù)存放起來,等待狀態(tài)確定后,再依次將對(duì)應(yīng)的函數(shù)執(zhí)行(發(fā)布訂閱)  
  11.  * 7. then 的參數(shù) onFulfilled 和 onRejected 可以缺省  
  12.  * 8. promise 可以then多次,promise 的then 方法返回一個(gè) promise  
  13.  * 9. 如果 then 返回的是一個(gè)結(jié)果,那么就會(huì)把這個(gè)結(jié)果作為參數(shù),傳遞給下一個(gè)then的成功的回調(diào)(onFulfilled)  
  14.  * 10. 如果 then 中拋出了異常,那么就會(huì)把這個(gè)異常作為參數(shù),傳遞給下一個(gè)then的失敗的回調(diào)(onRejected)  
  15.  * 11.如果 then 返回的是一個(gè)promise,那么會(huì)等這個(gè)promise執(zhí)行完,promise如果成功,  
  16.  *   就走下一個(gè)then的成功,如果失敗,就走下一個(gè)then的失敗  
  17.  */  
  18. const PENDING = 'pending' 
  19. const FULFILLED = 'fulfilled' 
  20. const REJECTED = 'rejected' 
  21. function Promise(executor) {  
  22.     let self = this 
  23.     self.status = PENDING 
  24.     self.onFulfilled = [];//成功的回調(diào)  
  25.     self.onRejected = []; //失敗的回調(diào)  
  26.     //PromiseA+ 2.1  
  27.     function resolve(value) {  
  28.         if (self.status === PENDING) {  
  29.             self.status = FULFILLED 
  30.             self.value = value;  
  31.             self.onFulfilled.forEach(fn => fn());//PromiseA+ 2.2.6.1  
  32.         }  
  33.     }  
  34.     function reject(reason) {  
  35.         if (self.status === PENDING) {  
  36.             self.status = REJECTED 
  37.             self.reason = reason;  
  38.             self.onRejected.forEach(fn => fn());//PromiseA+ 2.2.6.2  
  39.         } 
  40.      } 
  41.     try {  
  42.         executor(resolve, reject);  
  43.     } catch (e) {  
  44.         reject(e);  
  45.     }  
  46.  
  47. Promise.prototype.then = function (onFulfilled, onRejected) {  
  48.     //PromiseA+ 2.2.1 / PromiseA+ 2.2.5 / PromiseA+ 2.2.7.3 / PromiseA+ 2.2.7.4  
  49.     onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : value => value;  
  50.     onRejected = typeof onRejected === 'function' ? onRejected : reason => { throw reason };  
  51.     let self = this 
  52.     //PromiseA+ 2.2.7  
  53.     let promise2 = new Promise((resolve, reject) => {  
  54.         if (self.status === FULFILLED) {  
  55.             //PromiseA+ 2.2.2  
  56.             //PromiseA+ 2.2.4 --- setTimeout  
  57.             setTimeout(() => {  
  58.                 try {  
  59.                     //PromiseA+ 2.2.7.1  
  60.                     let x = onFulfilled(self.value);  
  61.                     resolvePromise(promise2, x, resolve, reject);  
  62.                 } catch (e) {  
  63.                     //PromiseA+ 2.2.7.2  
  64.                     reject(e);  
  65.                 }  
  66.             });  
  67.         } else if (self.status === REJECTED) {  
  68.             //PromiseA+ 2.2.3  
  69.             setTimeout(() => {  
  70.                 try {  
  71.                     let x = onRejected(self.reason);  
  72.                     resolvePromise(promise2, x, resolve, reject);  
  73.                 } catch (e) {  
  74.                     reject(e);  
  75.                 }  
  76.             });  
  77.         } else if (self.status === PENDING) {  
  78.             self.onFulfilled.push(() => {  
  79.                 setTimeout(() => {  
  80.                     try {  
  81.                         let x = onFulfilled(self.value);  
  82.                         resolvePromise(promise2, x, resolve, reject);  
  83.                     } catch (e) {  
  84.                         reject(e);  
  85.                     }  
  86.                 });  
  87.             });  
  88.             self.onRejected.push(() => {  
  89.                 setTimeout(() => {  
  90.                     try {  
  91.                         let x = onRejected(self.reason);  
  92.                         resolvePromise(promise2, x, resolve, reject);  
  93.                     } catch (e) {  
  94.                         reject(e);  
  95.                     }  
  96.                 });  
  97.             });  
  98.         }  
  99.     });  
  100.     return promise2;  
  101.  
  102. function resolvePromise(promise2, x, resolve, reject) {  
  103.     let self = this 
  104.     //PromiseA+ 2.3.1  
  105.     if (promise2 === x) {  
  106.         reject(new TypeError('Chaining cycle'));  
  107.     }  
  108.     if (x && typeof x === 'object' || typeof x === 'function') {  
  109.         let used; //PromiseA+2.3.3.3.3 只能調(diào)用一次  
  110.         try {  
  111.             let then = x.then;  
  112.             if (typeof then === 'function') {  
  113.                 //PromiseA+2.3.3  
  114.                 then.call(x, (y) => {  
  115.                     //PromiseA+2.3.3.1  
  116.                     if (used) return;  
  117.                     used = true 
  118.                     resolvePromise(promise2, y, resolve, reject);  
  119.                 }, (r) => {  
  120.                     //PromiseA+2.3.3.2  
  121.                     if (used) return;  
  122.                     used = true 
  123.                     reject(r);  
  124.                 });  
  125.             }else{  
  126.                 //PromiseA+2.3.3.4  
  127.                 if (used) return;  
  128.                 used = true 
  129.                 resolve(x);  
  130.             }  
  131.         } catch (e) {  
  132.             //PromiseA+ 2.3.3.2  
  133.             if (used) return;  
  134.             used = true 
  135.             reject(e);  
  136.         }  
  137.     } else {  
  138.         //PromiseA+ 2.3.3.4  
  139.         resolve(x);  
  140.     }  
  141.  
  142. module.exports = Promise

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

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

  1. PromisePromise.defer = Promise.deferred = function () {  
  2.     let dfd = {};  
  3.     dfd.promise = new Promise((resolve, reject) => {  
  4.         dfd.resolve = resolve;  
  5.         dfd.reject = reject;  
  6.     });  
  7.     return dfd;  

安裝測(cè)試腳本: 

  1. npm install -g promises-aplus-tests 

如果當(dāng)前的promise源碼的文件名為promise.js

那么在對(duì)應(yīng)的目錄執(zhí)行以下命令: 

  1. promises-aplus-tests promise.js 

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

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

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

      2.  在 resolvePromise 的函數(shù)中,為何需要usedd這個(gè)flag,同樣是因?yàn)橐?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來確保只會(huì)執(zhí)行一次。

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

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

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

術(shù)語

  1.   promise 是一個(gè)有then方法的對(duì)象或者是函數(shù),行為遵循本規(guī)范
  2.   thenable 是一個(gè)有then方法的對(duì)象或者是函數(shù)
  3.   value 是promise狀態(tài)成功時(shí)的值,包括 undefined/thenable或者是 promise
  4.   exception 是一個(gè)使用throw拋出的異常值
  5.   reason 是promise狀態(tài)失敗時(shí)的值

 要求

2.1 Promise States

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

2.1.1 如果promise在pending狀態(tài)

  1. 2.1.1.1 可以變成 fulfilled 或者是 rejected 

2.1.2 如果promise在fulfilled狀態(tài) 

  1. 2.1.2.1 不會(huì)變成其它狀態(tài)  
  2. 2.1.2.2 必須有一個(gè)value值 

2.1.3 如果promise在rejected狀態(tài) 

  1. 2.1.3.1 不會(huì)變成其它狀態(tài)  
  2. 2.1.3.2 必須有一個(gè)promise被reject的reason 

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

2.2 then方法

promise必須提供一個(gè)then方法,來訪問最終的結(jié)果

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

  1. promise.then(onFulfilled, onRejected) 

2.2.1 onFulfilled 和 onRejected 都是可選參數(shù) 

  1. 2.2.1.1 onFulfilled 必須是函數(shù)類型  
  2. 2.2.1.2 onRejected 必須是函數(shù)類型 

2.2.2 如果 onFulfilled 是函數(shù): 

  1. 2.2.2.1 必須在promise變成 fulfilled 時(shí),調(diào)用 onFulfilled,參數(shù)是promise的value  
  2. 2.2.2.2 在promise的狀態(tài)不是 fulfilled 之前,不能調(diào)用  
  3. 2.2.2.3 onFulfilled 只能被調(diào)用一次 

2.2.3 如果 onRejected 是函數(shù): 

  1. 2.2.3.1 必須在promise變成 rejected 時(shí),調(diào)用 onRejected,參數(shù)是promise的reason  
  2. 2.2.3.2 在promise的狀態(tài)不是 rejected 之前,不能調(diào)用  
  3. 2.2.3.3 onRejected 只能被調(diào)用一次 

2.2.4 onFulfilled 和 onRejected 應(yīng)該是微任務(wù)

2.2.5 onFulfilled  和 onRejected 必須作為函數(shù)被調(diào)用

2.2.6 then方法可能被多次調(diào)用 

  1. 2.2.6.1 如果promise變成了 fulfilled態(tài),所有的onFulfilled回調(diào)都需要按照then的順序執(zhí)行  
  2. 2.2.6.2 如果promise變成了 rejected態(tài),所有的onRejected回調(diào)都需要按照then的順序執(zhí)行 

2.2.7 then必須返回一個(gè)promise 

  1. promise2 = promise1.then(onFulfilled, onRejected);  
  2. 2.2.7.1 onFulfilled 或 onRejected 執(zhí)行的結(jié)果為x,調(diào)用 resolvePromise  
  3. 2.2.7.2 如果 onFulfilled 或者 onRejected 執(zhí)行時(shí)拋出異常e,promise2需要被reject  
  4. 2.2.7.3 如果 onFulfilled 不是一個(gè)函數(shù),promise2 以promise1的值fulfilled  
  5. 2.2.7.4 如果 onRejected 不是一個(gè)函數(shù),promise2 以promise1的reason rejected 

2.3 resolvePromise

resolvePromise(promise2, x, resolve, reject)

2.3.1 如果 promise2 和 x 相等,那么 reject promise with a TypeError

2.3.2 如果 x 是一個(gè) promsie 

  1. 2.3.2.1 如果x是pending態(tài),那么promise必須要在pending,直到 x 變成 fulfilled or rejected.  
  2. 2.3.2.2 如果 x 被 fulfilled, fulfill promise with the same value.  
  3. 2.3.2.3 如果 x 被 rejected, reject promise with the same reason. 

2.3.3 如果 x 是一個(gè) object 或者 是一個(gè) function 

  1. 2.3.3.1 let then = x.then.  
  2. 2.3.3.2 如果 x.then 這步出錯(cuò),那么 reject promise with e as the reason..  
  3. 2.3.3.3 如果 then 是一個(gè)函數(shù),then.call(x, resolvePromiseFn, rejectPromise)  
  4.     2.3.3.3.1 resolvePromiseFn 的 入?yún)⑹?nbsp;y, 執(zhí)行 resolvePromise(promise2, y, resolve, reject);  
  5.     2.3.3.3.2 rejectPromise 的 入?yún)⑹?nbsp;r, reject promise with r.  
  6.     2.3.3.3.3 如果 resolvePromise 和 rejectPromise 都調(diào)用了,那么第一個(gè)調(diào)用優(yōu)先,后面的調(diào)用忽略。  
  7.     2.3.3.3.4 如果調(diào)用then拋出異常e   
  8.         2.3.3.3.4.1 如果 resolvePromise 或 rejectPromise 已經(jīng)被調(diào)用,那么忽略  
  9.         2.3.3.3.4.3 否則,reject promise with e as the reason  
  10. 2.3.3.4 如果 then 不是一個(gè)function. fulfill promise with x. 

2.3.4 如果 x 不是一個(gè) 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()

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

Promise.resolve

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

  1.  如果 value 是個(gè) thenable 對(duì)象,返回的promise會(huì)“跟隨”這個(gè)thenable的對(duì)象,采用它的最終狀態(tài)
  2.  如果傳入的value本身就是promise對(duì)象,那么Promise.resolve將不做任何修改、原封不動(dòng)地返回這個(gè)promise對(duì)象。
  3.  其他情況,直接返回以該值為成功狀態(tài)的promise對(duì)象。 
  1. Promise.resolve = function (param) {  
  2.         if (param instanceof Promise) {  
  3.         return param;  
  4.     }  
  5.     return new Promise((resolve, reject) => {  
  6.         if (param && typeof param === 'object' && typeof param.then === 'function') {  
  7.             setTimeout(() => {  
  8.                 param.then(resolve, reject);  
  9.             });  
  10.         } else {  
  11.             resolve(param);  
  12.         }  
  13.     });  

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

測(cè)試代碼: 

  1. let p = Promise.resolve(20);  
  2. p.then((data) => {  
  3.     console.log(data);  
  4. });  
  5. let p2 = Promise.resolve({  
  6.     then: function(resolve, reject) {  
  7.         resolve(30);  
  8.     }  
  9. });  
  10. p2.then((data)=> {  
  11.     console.log(data)  
  12. });  
  13. let p3 = Promise.resolve(new Promise((resolve, reject) => {  
  14.     resolve(400)  
  15. }));  
  16. p3.then((data) => {  
  17.     console.log(data)  
  18. }); 

Promise.reject

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

  1. Promise.reject = function (reason) {  
  2.     return new Promise((resolve, reject) => {  
  3.         reject(reason);  
  4.     });  

Promise.prototype.catch

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

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

Promise.prototype.finally

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

  1. Promise.prototype.finally = function (callback) {  
  2.     return this.then((value) => {  
  3.         return Promise.resolve(callback()).then(() => {  
  4.             return value;  
  5.         });  
  6.     }, (err) => {  
  7.         return Promise.resolve(callback()).then(() => {  
  8.             throw err;  
  9.         });  
  10.     });  

Promise.all

Promise.all(promises) 返回一個(gè)promise對(duì)象

  1.  如果傳入的參數(shù)是一個(gè)空的可迭代對(duì)象,那么此promise對(duì)象回調(diào)完成(resolve),只有此情況,是同步執(zhí)行的,其它都是異步返回的。
  2.  如果傳入的參數(shù)不包含任何 promise,則返回一個(gè)異步完成.
  3.  promises 中所有的promise都promise都“完成”時(shí)或參數(shù)中不包含 promise 時(shí)回調(diào)完成。
  4.  如果參數(shù)中有一個(gè)promise失敗,那么Promise.all返回的promise對(duì)象失敗
  5.  在任何情況下,Promise.all 返回的 promise 的完成狀態(tài)的結(jié)果都是一個(gè)數(shù)組 
  1. Promise.all = function (promises) {  
  2.     promises = Array.from(promises);//將可迭代對(duì)象轉(zhuǎn)換為數(shù)組  
  3.     return new Promise((resolve, reject) => {  
  4.         let index = 0 
  5.         let result = [];  
  6.         if (promises.length === 0) {  
  7.             resolve(result);  
  8.         } else {  
  9.             function processValue(i, data) { 
  10.                  result[i] = data;  
  11.                 if (++index === promises.length) {  
  12.                     resolve(result);  
  13.                 }  
  14.             }  
  15.             for (let i = 0; i < promises.length; i++) {  
  16.                   //promises[i] 可能是普通值  
  17.                   Promise.resolve(promises[i]).then((data) => {  
  18.                     processValue(i, data);  
  19.                 }, (err) => {  
  20.                     reject(err); 
  21.                      return;  
  22.                 });  
  23.             }  
  24.         }  
  25.     });  

測(cè)試代碼: 

  1. var promise1 = new Promise((resolve, reject) => {  
  2.     resolve(3);  
  3. })  
  4. var promise2 = 42 
  5. var promise3 = new Promise(function(resolve, reject) {  
  6.   setTimeout(resolve, 100, 'foo');  
  7. });  
  8. Promise.all([promise1, promise2, promise3]).then(function(values) {  
  9.   console.log(values); //[3, 42, 'foo']  
  10. },(err)=> 
  11.     console.log(err)  
  12. });  
  13. var p = Promise.all([]); // will be immediately resolved  
  14. var p2 = Promise.all([1337, "hi"]); // non-promise values will be ignored, but the evaluation will be done asynchronously  
  15. console.log(p);  
  16. console.log(p2)  
  17. setTimeout(function(){  
  18.     console.log('the stack is now empty');  
  19.     console.log(p2);  
  20. }); 

Promise.race

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

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

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

  1. Promise.race = function (promises) {  
  2.     promises = Array.from(promises);//將可迭代對(duì)象轉(zhuǎn)換為數(shù)組  
  3.     return new Promise((resolve, reject) => {  
  4.         if (promises.length === 0) {  
  5.             return; 
  6.          } else {  
  7.             for (let i = 0; i < promises.length; i++) {  
  8.                 Promise.resolve(promises[i]).then((data) => {  
  9.                     resolve(data);  
  10.                     return;  
  11.                 }, (err) => {  
  12.                     reject(err);  
  13.                     return;  
  14.                 });  
  15.             }  
  16.         }  
  17.     });  

測(cè)試代碼: 

  1. Promise.race([  
  2.     new Promise((resolve, reject) => { setTimeout(() => { resolve(100) }, 1000) }),  
  3.     undefined,  
  4.     new Promise((resolve, reject) => { setTimeout(() => { reject(100) }, 100) })  
  5. ]).then((data) => {  
  6.     console.log('success ', data);  
  7. }, (err) => {  
  8.     console.log('err ',err);  
  9. });  
  10. Promise.race([  
  11.     new Promise((resolve, reject) => { setTimeout(() => { resolve(100) }, 1000) }),  
  12.     new Promise((resolve, reject) => { setTimeout(() => { resolve(200) }, 200) }),  
  13.     new Promise((resolve, reject) => { setTimeout(() => { reject(100) }, 100) })  
  14. ]).then((data) => {  
  15.     console.log(data);  
  16. }, (err) => {  
  17.     console.log(err);  
  18. });  

 

責(zé)任編輯:龐桂玉 來源: 前端大全
相關(guān)推薦

2021-03-09 07:37:42

技術(shù)Promise測(cè)試

2023-09-15 15:31:23

異步編程Promise

2020-11-27 08:02:41

Promise

2021-09-02 12:07:48

Swift 監(jiān)聽系統(tǒng)Promise

2020-12-15 08:01:24

Promise參數(shù)ES6

2018-03-13 16:04:45

Promise執(zhí)行順序

2022-01-21 08:50:15

Promise任務(wù)隊(duì)列前端

2015-07-23 11:59:27

JavascriptPromise

2021-04-29 08:28:24

架構(gòu)參數(shù)傳遞

2020-10-23 10:10:59

Promise前端代碼

2021-04-27 08:31:37

Promisereject信息

2021-04-28 08:21:21

Promise.any服務(wù)器場(chǎng)景

2023-10-08 10:21:11

JavaScriptAsync

2016-09-18 21:14:54

JavascriptPromiseWeb

2016-09-21 21:49:37

PromiseJavascript前端

2016-11-01 19:22:36

Javascript前端Promise

2022-09-28 12:23:36

Promise代碼

2017-05-11 20:20:59

JavascriptPromiseWeb

2023-01-12 11:23:11

Promise異步編程

2021-06-06 08:30:29

N-APIPromiseAPI
點(diǎn)贊
收藏

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

日本高清不卡视频| 不卡的av在线| 久久国产精品偷| 性活交片大全免费看| 国产资源在线观看入口av| aaa亚洲精品| 国产精品日韩精品| 亚洲色图综合区| 美国十次av导航亚洲入口| 欧美在线免费播放| 日本久久久网站| 免费黄色在线视频网站| 国产精品自在欧美一区| 欧美在线免费观看| 少妇被躁爽到高潮无码文| 天海翼精品一区二区三区| 6080国产精品一区二区| 国产中文字幕视频在线观看| lutube成人福利在线观看| 岛国精品一区二区| 国产精品第七影院| 免费毛片一区二区三区| 天天久久综合| 亚洲人成网7777777国产| 极品人妻一区二区| 福利一区在线| 午夜精品免费在线观看| 日韩一级片一区二区| 成人亚洲综合天堂| 91视频国产观看| 成人动漫在线视频| 国产精品免费无遮挡| 美女黄色成人网| 国产+人+亚洲| 国产高清在线免费观看| 日韩免费视频| 国产亚洲欧美一区| 无码人妻精品一区二区三区温州| 一区二区在线免费播放| 欧美一区在线视频| 国产成人美女视频| 国产极品嫩模在线观看91精品| 欧美日韩午夜激情| 免费无码毛片一区二三区| 在线你懂的视频| 综合色天天鬼久久鬼色| 台湾成人av| 国产日韩精品在线看| 97久久超碰精品国产| 国产精品乱子乱xxxx| 亚洲国产精品国自产拍久久| 国产久卡久卡久卡久卡视频精品| 国产美女搞久久| 亚洲视频在线免费播放| 蜜臀久久久久久久| 国产精品自产拍在线观看| 欧美男人天堂网| 日韩黄色片在线观看| 国产成人精品久久二区二区| 九九九在线观看| 国产精品一级| 秋霞成人午夜鲁丝一区二区三区| 亚洲AV无码成人精品区东京热| 国产精品久久久免费| 国产97色在线| 黄色一区二区视频| 精品一区二区三区免费观看| 成人激情电影一区二区| 99热这里只有精品99| 国产99精品在线观看| 91情侣在线视频| 高h放荡受浪受bl| 99久久亚洲一区二区三区青草| 精品蜜桃传媒| 成人免费黄色网页| 亚洲欧洲99久久| 欧美国产视频一区| 欧美日韩在线观看首页| 欧洲在线/亚洲| 三级av免费看| 红杏一区二区三区| 夜夜嗨av一区二区三区四区| 亚洲国产精品一区二区久久hs| 亚洲国产一区二区三区在线播放| 久久久久久久久久久成人| 成人在线免费看视频| 美国十次了思思久久精品导航| 成人性生交大片免费看小说| 亚洲精品97久久中文字幕无码| zzijzzij亚洲日本少妇熟睡| 欧美三级电影在线播放| 激情视频在线观看| 黄色一区二区在线观看| 免费看污污网站| 国产精品1区| 亚洲精品一区中文字幕乱码| 日本成人精品视频| 一区二区黄色| 国产中文字幕91| 天天综合网在线| 自拍偷拍亚洲激情| 久久久久人妻精品一区三寸| 成人免费91| 亚洲美女av在线播放| 成人涩涩小片视频日本| 久久国产精品毛片| 亚洲最大成人免费视频| 九一在线视频| 亚洲午夜影视影院在线观看| 嫩草影院国产精品| 日韩有码一区| 欧美大荫蒂xxx| 中文字幕一级片| 91亚洲精品一区二区乱码| 亚洲免费av网| 你懂得影院夜精品a| 亚洲第一精品福利| 久久国产高清视频| 性久久久久久| 国严精品久久久久久亚洲影视| 毛片在线播放a| 色吊一区二区三区| 国产精品久久AV无码| 在线看片不卡| 国产精品偷伦免费视频观看的| 天天色棕合合合合合合合| 亚洲精品大片www| 日本 片 成人 在线| 久久av中文| 91国产美女视频| 午夜免费福利视频| 最新中文字幕一区二区三区| 久久精品影视大全| 欧美色爱综合| 国产精品91在线| 日韩三级电影网| 五月天中文字幕一区二区| 美女流白浆视频| 自产国语精品视频| 91精品视频观看| 日本天堂在线观看| 欧美日韩精品一区二区三区| 欧美激情视频二区| 丝袜美腿亚洲一区二区图片| 久久久久久九九| 午夜裸体女人视频网站在线观看| 欧美精品一区二区三区很污很色的 | 国产免费a级片| 91超碰成人| 亚洲tv在线观看| 3d玉蒲团在线观看| 日韩欧美一级精品久久| 欧美偷拍第一页| 国产精品一级黄| 成人在线视频一区二区三区| 亚洲精品在线国产| 久久久中文字幕| 色呦呦中文字幕| 午夜精品久久久久久不卡8050| 97人妻精品一区二区三区免费| 在线视频观看日韩| 精品免费二区三区三区高中清不卡| 国产一二在线播放| 日韩经典第一页| 无码人妻精品一区二区50| 国产拍揄自揄精品视频麻豆| jizz欧美性11| 中文字幕一区二区三三| 国产免费一区| 全亚洲第一av番号网站| 最好看的2019年中文视频| 国产手机视频在线| 亚洲午夜羞羞片| 国产精品视频免费观看| www.桃色.com| 999久久久免费精品国产| 91久久精品视频| 91制片在线观看| 亚洲欧美日韩中文视频| 91精品视频免费在线观看| 亚洲精品大片www| 黑人巨大精品欧美| 精品中文av资源站在线观看| 欧美 亚洲 视频| 偷窥自拍亚洲色图精选| 国产欧美精品日韩| 岛国片av在线| 一区二区三区国产视频| 国产日韩欧美中文字幕| 欧美日韩一区二区在线 | 影音先锋欧美激情| 欧美综合激情网| 蜜桃视频网站在线| 日韩精品福利在线| 91福利在线观看视频| 亚洲成人免费看| 国产成人精品视频免费| 丁香六月综合激情| 另类小说色综合| 亚洲大胆av| 在线精品日韩| 蜜桃a∨噜噜一区二区三区| 国产日韩欧美影视| 麻豆视频在线观看免费网站黄| 深夜福利一区二区| 五月婷婷在线播放| 欧美一区二区三区视频在线| 免费av网站在线| 亚洲精品免费在线观看| 妺妺窝人体色WWW精品| 成人激情小说乱人伦| 香蕉视频999| 久久综合五月| 国产69精品久久久久久久| 久久亚洲影视| 日韩国产欧美精品| 欧美精品国产白浆久久久久| 亚洲精品日韩av| 国产一区影院| 国产成人综合精品| 午夜裸体女人视频网站在线观看| 欧美日本在线视频中文字字幕| 午夜在线小视频| 亚洲片国产一区一级在线观看| 亚洲免费视频网| 欧美日本韩国一区| 波多野结衣家庭主妇| 五月天中文字幕一区二区| 欧美成人精品一区二区免费看片 | 91高清免费观看| 欧美国产欧美亚州国产日韩mv天天看完整 | 一二三四视频在线中文| 欧美黑人xxxx| 日本动漫理论片在线观看网站| 日韩在线免费观看视频| 国产一区二区三区不卡在线| 日韩av最新在线| 天堂在线中文字幕| 亚洲精品suv精品一区二区| 国产高清在线观看视频| 欧美一区二区三级| 国产女人高潮毛片| 欧美一区二区视频在线观看2022 | 国产高潮在线| 国内精品久久久久影院 日本资源| 在线观看操人| 欧美精品videosex极品1| 午夜影院免费在线| 欧美黑人性视频| 免费毛片在线看片免费丝瓜视频| 欧美精品情趣视频| 青青青草视频在线| 欧美精品久久久久久久| 99热99re6国产在线播放| 久久欧美在线电影| 松下纱荣子在线观看| 欧美中文字幕精品| 亚洲日本网址| 91欧美精品成人综合在线观看| 自拍偷拍亚洲图片| 99精品99久久久久久宅男| 成人av资源网址| 蜜桃精品久久久久久久免费影院| 精品在线手机视频| 亚洲不卡1区| 一区二区三区在线观看免费| 黄色三级中文字幕| 99成人在线| 国产视频手机在线播放| 国产在线麻豆精品观看| 久久免费精品国产| 久久五月婷婷丁香社区| 亚洲av成人无码久久精品| 中文字幕中文字幕一区| 亚洲国产成人精品综合99| 亚洲va欧美va国产va天堂影院| 久久精品一二区| 欧美日韩一级二级| 亚洲国产福利视频| 一本色道久久综合狠狠躁篇怎么玩| 91xxx在线观看| 欧美极品少妇xxxxx| 经典三级一区二区| 川上优av一区二区线观看| 欧美天堂影院| 超碰免费在线公开| 亚洲美女毛片| jizzzz日本| heyzo一本久久综合| 少妇太紧太爽又黄又硬又爽小说| 亚洲三级免费电影| 波多野结衣国产| 欧美日韩国产综合久久| www.亚洲天堂.com| 亚洲香蕉伊综合在人在线视看| 超碰公开在线| 国产福利成人在线| 伊人久久影院| 一区二区三区视频| 亚洲自啪免费| 国产一级片自拍| 久久午夜电影网| 久操免费在线视频| 欧美日韩三级视频| 香蕉国产在线视频| 欧美插天视频在线播放| 成人影院av| 国产精品xxxx| 亚洲自拍偷拍网| 91香蕉视频污版| 不卡视频免费播放| 欧美爱爱小视频| 欧美系列一区二区| 日本大臀精品| 欧美激情图片区| 99精品美女视频在线观看热舞| 蜜桃视频日韩| 亚洲人成人一区二区三区| 三区视频在线观看| 欧美韩日一区二区三区四区| 国产小视频在线观看免费| 欧美精品 国产精品| 黄色毛片在线看| 2019精品视频| 国产香蕉精品| 真人做人试看60分钟免费| 美女网站色91| 午夜精产品一区二区在线观看的| 精品高清美女精品国产区| 亚洲成人中文字幕在线| 久久亚洲综合国产精品99麻豆精品福利| 欧美成人性网| 麻豆亚洲一区| 国产手机视频一区二区| 中文视频在线观看| 亚洲一区二区欧美| 亚洲乱码在线观看| 欧美寡妇偷汉性猛交| 国产精品美女久久久久人| 亚洲日本理论电影| 美腿丝袜亚洲色图| 国产欧美小视频| 欧美三级中文字幕在线观看| 国产视频福利在线| 国产精品成人一区二区三区吃奶| 免费久久精品| www.日日操| 国产欧美日韩不卡免费| 国产天堂第一区| 在线观看视频亚洲| 巨大黑人极品videos精品| 亚洲一区三区在线观看| 精品一区二区成人精品| 久久99久久99精品免费看小说| 欧美女孩性生活视频| 一级毛片视频在线| 成人中文字幕+乱码+中文字幕| 亚洲精品网址| 久久人妻少妇嫩草av蜜桃| 亚洲成人免费视| 男生女生差差差的视频在线观看| 日韩av日韩在线观看| 日韩精品影视| 日韩视频在线观看一区二区三区| 亚洲精品乱码久久久久久| 蜜桃av鲁一鲁一鲁一鲁俄罗斯的| 久久久久久久国产精品视频| 亚洲v天堂v手机在线| 九色91popny| 亚洲日本成人在线观看| 国模人体一区二区| 欧美一级免费视频| 色偷偷综合网| 久久久国产精品久久久| 午夜精品一区二区三区免费视频| 国产资源在线观看| 成人黄色av免费在线观看| 亚洲午夜av| 第一次破处视频| 日韩一级二级三级| 这里有精品可以观看| 亚洲午夜精品久久久久久浪潮| 国产福利一区二区三区在线视频| 国产第一页在线播放| 亚洲一区二区久久久| 电影91久久久| 欧美老熟妇喷水| 亚洲三级在线播放| 青青青手机在线视频观看| 成人国产精品一区二区| 一区二区三区国产在线| 农村老熟妇乱子伦视频| 亚洲精品在线一区二区| 国产一区二区三区四区五区3d | 欧美亚洲视频| 国产第一页浮力| 精品视频久久久| 精品国模一区二区三区欧美| 黄色一级片播放| 亚洲另类在线一区|