自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

這次徹底搞懂Promise(手寫(xiě)源碼多注釋篇)

開(kāi)發(fā) 前端
promise 是 js 里面非常重要的一部分,搞懂了 promise 才能更好的去理解 async,await 和 generator。

[[347964]]

 前言

promise 是 js 里面非常重要的一部分,搞懂了 promise 才能更好的去理解 async,await 和 generator。但是往往很多時(shí)候就是不理解 promise 的機(jī)制,所以這次通過(guò)一步步實(shí)現(xiàn)一個(gè) promise 來(lái)加深自己的印象,提高自己的思維。

大概的架子

通過(guò)我們經(jīng)常寫(xiě)的 promise 語(yǔ)法,我們可以先寫(xiě)一個(gè)大概的架子出來(lái),promise 接受回調(diào),并且調(diào)用,自身帶有三種狀態(tài),pendding, onFulfilled, onRejected,并且 resolve 這個(gè)函數(shù)可以讓 pendding 狀態(tài)變成 onFulfilled 狀態(tài),同理 reject 函數(shù)可以讓 pendding 狀態(tài)變成 onRejected 狀態(tài)。我們先把上面描述部分實(shí)現(xiàn)了。 

  1. const PromiseCopy = function (fn) {  
  2.   this.info = {  
  3.     status: "pending",  
  4.     value: "",  
  5.   };  
  6.   const self = this 
  7.   self.onFulfilledArr = []; // then函數(shù)里面的第一個(gè)回調(diào)函數(shù)的集合  
  8.   self.onRejectedArr = []; // then函數(shù)里面的第二個(gè)回調(diào)函數(shù)的集合  
  9.   const resolve = function (value) {  
  10.     // 加這個(gè)判斷是為了表示,只有在pendding狀態(tài)下才會(huì)去執(zhí)行  
  11.     // 狀態(tài)已經(jīng)變成onFulfilled之后就不能再去改變了  
  12.     // 符合PromiseA+中的2.1.2.1  
  13.     if (self.info.status === "pending") {  
  14.       self.info.status = "onFulfilled" 
  15.       self.info.value = value;  
  16.       self.onFulfilledArr.forEach((fn) => fn(value));  
  17.     }  
  18.   };  
  19.   // 和上面同理符合PromiseA+,2.1.3.1  
  20.   const reject = function (value) {  
  21.     if (self.info.status === "pending") {  
  22.       self.info.status = "onRejected"  
  23.       self.info.value = value;  
  24.       self.onRejectedArr.forEach((fn) => fn(value));  
  25.     }  
  26.   };  
  27.   fn(resolve, reject);  
  28. }; 

resolve 的附加實(shí)現(xiàn)

其實(shí)寫(xiě)到這里我們的 resolve 函數(shù)還是有一些功能沒(méi)有實(shí)現(xiàn)的, 我們知道 調(diào)用 resolve(x), x 的值有好幾種情況,如下

  •  如果 x 是 Promise 實(shí)例本身,則拋出錯(cuò)誤
  •  如果 x 是一個(gè) Promise 對(duì)象,那么 then 函數(shù)的執(zhí)行取決這個(gè) x 的狀態(tài),如果 x 也調(diào)用 resolve(y),其中 y 也是一個(gè) promise 對(duì)象.那么 then 函數(shù)的執(zhí)行取決于這個(gè) promise 對(duì)象,依次類(lèi)推,直到最后一個(gè) promise 狀態(tài)更改
  •  如果 x 是一個(gè) thenable 對(duì)象,就是一個(gè)對(duì)象包含 then 這個(gè)屬性,或者是一個(gè)函數(shù)包含一個(gè) then 的靜態(tài)方法,那么直接執(zhí)行 then 函數(shù)
  •  如果 x 是一個(gè)普通值,直接變成 onFulfilled 狀態(tài),執(zhí)行后面的 then 函數(shù)

思考

  •  網(wǎng)上實(shí)現(xiàn)的大部分 resolve 都是我上面的代碼,但是根據(jù)規(guī)范,resolve 函數(shù)里面應(yīng)該是要判斷上面幾點(diǎn)的,所以我們上面寫(xiě)的代碼是有誤的
  •  還有一個(gè)問(wèn)題是,我們需要在 resolve 函數(shù)里面判斷 x 是不是實(shí)例的本身,但是正常的 resolve 函數(shù)我們經(jīng)常是傳入一個(gè)參數(shù),所以中間肯定是有一個(gè)中間函數(shù)的,看下面的代碼 
  1. const PromiseCopy = function (fn) {  
  2.   this.info = {  
  3.     status: "pending", 
  4.      value: "",  
  5.   };  
  6.   const self = this 
  7.   self.onFulfilledArr = []; // then函數(shù)里面的第一個(gè)回調(diào)函數(shù)的集合  
  8.   self.onRejectedArr = []; // then函數(shù)里面的第二個(gè)回調(diào)函數(shù)的集合  
  9.   // _resolve 是我們經(jīng)常調(diào)用的resolve  
  10.   // 但是真正實(shí)現(xiàn)的應(yīng)該是里面的resolve  
  11.   const _resolve = function (value) {  
  12.     // 這個(gè)函數(shù)得改變一下  
  13.     // PromiseCopy一旦被實(shí)例化,那么self就是實(shí)例本身了  
  14.     resolve(self, value);  
  15.   };  
  16.   // 此時(shí)我們就可以在resolve進(jìn)行判斷了  
  17.   const resolve = function (promise, value) {  
  18.     let ifexec = false 
  19.     // 首先判斷value是不是promise本身  
  20.     if (value === promise) {  
  21.       // 一定要用TypeError寫(xiě) 不然promises-aplus-tests跑不通  
  22.       // 切記這是第一個(gè)坑,promises-aplus-tests只認(rèn)TypeError這種錯(cuò)誤形式  
  23.       reject(new TypeError("A promise cannot be onFulfilled with itself."));  
  24.     }  
  25.     // value是一個(gè)thenable對(duì)象  
  26.     // 這個(gè)要Object.prototype.toString.call(value) === "[object Object]"判斷 
  27.  
  28.     // 不然resolve([])有問(wèn)題,不知道是不是我實(shí)現(xiàn)問(wèn)題  
  29.     if (  
  30.       value &&  
  31.       (Object.prototype.toString.call(value) === "[object Object]" ||  
  32.         typeof value === "function")  
  33.     ) {  
  34.       // var promise1 = Promise.resolve(dump).then(function () {  
  35.       //   return {  
  36.       //     then: (resolve, reject) => {  
  37.       //       setTimeout(() => {  
  38.       //         resolve({  
  39.       //           then: (resolve, reject) => {  
  40.       //             resolve("aa111a");  
  41.       //             throw "other";  
  42.       //           },  
  43.       //         });  
  44.       //       });  
  45.       //     },  
  46.       //   };  
  47.       // });  
  48.       // promise1.then(  
  49.       //   (res) => {  
  50.       //     console.log(res === "aa111a");  
  51.       //     console.log("aaa");  
  52.       //   },  
  53.       //   (res) => {  
  54.       //     console.log(res);  
  55.       //     console.log("error");  
  56.       //   }  
  57.       // );  
  58.       // 這里的try--catch一定要加 ,不然會(huì)promises-aplus-tests會(huì)一直報(bào)錯(cuò),這是第三個(gè)大坑  
  59.       // 因?yàn)閜romises-aplus-test測(cè)試?yán)锩嬗羞@一條的  
  60.       // 看上面注釋例子  
  61.       try {  
  62.         // 拿到then函數(shù)  
  63.         const then = value.then;  
  64.         // 如果then是一個(gè)函數(shù)則執(zhí)行這個(gè)函數(shù)  
  65.         if (typeof then === "function") {  
  66.           // 為什么要.call(value, x, y) 你們可以自己試一下原生的Promise在這種情況下this指向的就是value,所以要綁定  
  67.           // 因?yàn)閠hen我們已經(jīng)拿出來(lái)了then = value.then,直接調(diào)用then(),this就指向的window  
  68.           // 為什么后面還需要綁定兩個(gè)函數(shù)了  
  69.           // 根據(jù)原生的Promise可知,thenable中的then函數(shù)可以接受兩個(gè)函數(shù)resolve,reject  
  70.           // 只有手動(dòng)調(diào)用了resolve和reject才會(huì)執(zhí)行后面的.then操作,具體大家自己操作下  
  71.           then.call(  
  72.             value, 
  73.              function (value) {  
  74.               if (ifexec) {  
  75.                 return;  
  76.               }  
  77.               // ifexec這個(gè)一定要加,不然也會(huì)報(bào)200ms錯(cuò)誤,第四個(gè)大坑  
  78.               // 目的是為了不讓多次執(zhí)行,語(yǔ)言無(wú)法表達(dá)看下面的例子  
  79.               // var promise1 = Promise.resolve(dump).then(function () {  
  80.               //   return {  
  81.               //     then: (resolve, reject) => {  
  82.               //       resolve("aa111a");  
  83.               //       resolve("aa111a");  
  84.               //     },  
  85.               //   };  
  86.               // });  
  87.               ifexec = true 
  88.               resolve(promise, value);  
  89.             },  
  90.             function (value) {  
  91.               if (ifexec) {  
  92.                 return;  
  93.               }  
  94.               ifexec = true 
  95.               reject(value);  
  96.             }  
  97.           );  
  98.           return;  
  99.         }  
  100.       } catch (e) {  
  101.         if (ifexec) {  
  102.           return;  
  103.         }  
  104.         ifexec = true 
  105.         reject(e);  
  106.       } 
  107.     }  
  108.     // 下面這一點(diǎn)非常的重要,是async,await 和一些插件比如saga的核心  
  109.     // 就是如果x是一個(gè)promise對(duì)象,那么then的執(zhí)行取決于x的狀態(tài)  
  110.     // 還有這一個(gè)判斷一定要放在這里,不要和上面的換 不然promises-aplus-tests會(huì)報(bào)一個(gè)超過(guò)200ms的錯(cuò)誤,切記這是第二個(gè)坑  
  111.     if (value && value instanceof PromiseCopy && value.then === promise.then) {  
  112.       // 將promise的onFulfilledArr給到value  
  113.       // 但是還沒(méi)有那么簡(jiǎn)單我們要明白兩點(diǎn)  
  114.       // 如果value這個(gè)promise已經(jīng)不是pendding,我們給了他也沒(méi)有用,所以需要直接調(diào)用  
  115.       if (value.info.status === "pending") {  
  116.         value.onFulfilledArr = self.onFulfilledArr;  
  117.         value.onRejectedArr = self.onRejectedArr;  
  118.       }  
  119.       // 如果value狀態(tài)是onFulfilled  
  120.       if (value.info.status === "onRejected") {  
  121.         self.info.value = value.info.value;  
  122.         self.onRejectedArr.forEach((fn) => fn(value.info.value)); 
  123.       }  
  124.       // 如果value狀態(tài)是reject  
  125.       if (value.info.status === "onFulfilled") {  
  126.         self.info.value = value.info.value;  
  127.         self.onFulfilledArr.forEach((fn) => fn(value.info.value));  
  128.       }  
  129.       return;  
  130.     }  
  131.     // 如果是一個(gè)普通的值  
  132.     // 加這個(gè)判斷是為了表示,只有在pendding狀態(tài)下才會(huì)去執(zhí)行  
  133.     // 狀態(tài)已經(jīng)變成onFulfilled之后就不能再去改變了  
  134.     // 符合PromiseA+中的2.1.2.1  
  135.     if (self.info.status === "pending") {  
  136.       self.info.status = "onFulfilled" 
  137.       self.info.value = value;  
  138.       self.onFulfilledArr.forEach((fn) => fn(value));  
  139.     }  
  140.   };  
  141.   // 和上面同理符合PromiseA+,2.1.3.1  
  142.   // reject沒(méi)有resolve那么多規(guī)則,比較簡(jiǎn)單  
  143.   const reject = function (value) {  
  144.     if (self.info.status === "pending") {  
  145.       self.info.status = "onRejected" 
  146.       self.info.value = value;  
  147.       self.onRejectedArr.forEach((fn) => fn(value));  
  148.     }  
  149.   };  
  150.   // 此時(shí)fn調(diào)用的是_reoslve  
  151.   // 這個(gè)try catch主要是實(shí)現(xiàn)promiseCopy.prototype.catch  
  152.   try {  
  153.     fn(_resolve, reject);  
  154.   } catch (e) {  
  155.     setTimeout(() => {  
  156.       self.onRejectedArr.forEach((fn) => fn(e));  
  157.     });  
  158.   }  
  159. }; 

then 的實(shí)現(xiàn)

我們上面介紹的是 promise 的 resolve 用法,promise 還有一個(gè)基本用法就是后面接 then,因?yàn)槭?then 所以我們想到的是這個(gè) then 方法掛在到原型上的,那么 new PromiseCopy 的時(shí)候就可以得到這個(gè) then。then 里面是兩個(gè)函數(shù),一個(gè)是 onFulfilled 后執(zhí)行的回調(diào),一個(gè)是 onRejected 后執(zhí)行的回調(diào)?,F(xiàn)在的問(wèn)題是他是怎么做到 then 里面的函數(shù)是在 resolve 和 reject 后執(zhí)行的?這種推遲執(zhí)行或者說(shuō)在某種情況下去執(zhí)行我們想到的就是觀察者模式了。下面用代碼把上面的話實(shí)現(xiàn)一遍,在代碼里面會(huì)寫(xiě)詳細(xì)一點(diǎn)的注釋。 

  1. PromiseCopy.prototype.then = function (onFulfilled, onRejected) {  
  2.   const self = this 
  3.   // 這里要判斷下,如果PromiseCopy是resolve了那么就直接執(zhí)行onFulfilled  
  4.   if (self.info.status === "onFulfilled") {  
  5.     setTimeout(() => {  
  6.       onFulfilled(self.info.value);  
  7.     });  
  8.   }  
  9.   if (self.info.status === "onRejected") {  
  10.     setTimeout(() => {  
  11.       onRejected(self.info.value);  
  12.     }); 
  13.   }  
  14.   // 根據(jù)PromiseA+中的2.2.1.1和2.2.1.2,onFulfilled和onRejected必須是函數(shù),不然就會(huì)被忽略  
  15.   if (typeof onFulfilled === "function") {  
  16.     self.onFulfilledArr.push(() => {  
  17.       setTimeout(() => {  
  18.         onFulfilled(self.info.value);  
  19.       });  
  20.     });  
  21.   }  
  22.   if (typeof onRejected === "function") {  
  23.     self.onRejectedArr.push(() => {  
  24.       setTimeout(() => {  
  25.         onRejected(self.info.value);  
  26.       });  
  27.     });  
  28.   }  
  29.   // 根據(jù)PromiseA+ 2.2.7規(guī)范 then函數(shù)必須返回一個(gè)promise對(duì)象  
  30.   return new PromiseCopy((resolve, reject) => {});  
  31. }; 

then 的額外實(shí)現(xiàn)

上面實(shí)現(xiàn)的 then 也是一個(gè)簡(jiǎn)單的用法,不過(guò)根據(jù) PromiseA+的規(guī)范這個(gè) then 函數(shù)還有幾個(gè)點(diǎn)沒(méi)有實(shí)現(xiàn),看代碼解釋 

  1. promise2 = promise1.then(onFulfilled, onRejected);  
  2. promise2.then(onFulfilled, onRejected); 
  •  promise1.then 中的 onFulfilled,onRejected 函數(shù)如果返回一個(gè) x,那么當(dāng)作[[Resolve]](promise2, x)來(lái)處理,就跟上面的 resolve 一樣處理,注意如果函數(shù)什么都沒(méi)有返回,就是返回的 undefined
  •  promise1.then 函數(shù)中的兩個(gè)回調(diào)函數(shù)只要有一個(gè)報(bào)錯(cuò),那么直接調(diào)用 promise2.then 函數(shù)中的錯(cuò)誤回調(diào)
  •  如果 promise1.then 的第一個(gè)回調(diào)不是函數(shù),并且 promise1 調(diào)用的是 resolve,那么 promise2.then 的第一個(gè)回調(diào)參數(shù)是 promise1 中 resolve 函數(shù)的拋出值
  •  同理,如果 promise1.then 第二個(gè)回調(diào)不是函數(shù),并且 promise1 調(diào)用的是 reject,那么 promise2.then 中的錯(cuò)誤回調(diào)就會(huì)執(zhí)行

思考

如果像上面這么說(shuō)的話,這個(gè)新拋出來(lái)的 promise 何時(shí)調(diào)用這個(gè) resolve 或者 reject 是一個(gè)關(guān)鍵, 并且這個(gè)拋出的 promise 的執(zhí)行還得看 onFulfilled 和 onRejected 返回值,這一點(diǎn)當(dāng)時(shí)寫(xiě) promise 的時(shí)候想了很久,不知道如何組織,后來(lái)實(shí)在想不出來(lái),看了下網(wǎng)上很多文章,發(fā)現(xiàn)這些邏輯都是在 PromiseCopy 主體里面實(shí)現(xiàn)的。

return new PromiseCopy((resolve, reject) => {});

then 實(shí)現(xiàn)加強(qiáng)版 

  1. PromiseCopy.prototype.then = function (onFulfilled, onRejected) {  
  2.   const self = this 
  3.   // 這個(gè)一定要這么寫(xiě)目的為了讓值傳遞  
  4.   onFulfilled = typeof onFulfilled === "function" ? onFulfilled : (val) => val;  
  5.   // 這個(gè)一定要這么寫(xiě),一定要拋出一個(gè)錯(cuò)throw err  
  6.   onRejected =  
  7.     typeof onRejected === "function"  
  8.       ? onRejected  
  9.       : (err) => {  
  10.           throw err;  
  11.         };  
  12.   const newnewPromise = new PromiseCopy((resolve, reject) => {  
  13.     if (self.info.status === "onFulfilled") {  
  14.       setTimeout(() => {  
  15.         try {  
  16.           // 如果onFulfilled不是一個(gè)函數(shù)resolve--self.info.value  
  17.           let value = self.info.value;  
  18.           // 這個(gè)注釋不要,留著只是為了記錄當(dāng)時(shí)的思路  
  19.           // 這個(gè)加判斷是為了防止then函數(shù)逇回調(diào)不是一個(gè)函數(shù),,是一個(gè)字符串  
  20.           //   if (typeof onFulfilled === "function") {  
  21.           //     value = onFulfilled(value);  
  22.           //   }  
  23.           value = onFulfilled(value);  
  24.           // 這里要做一個(gè)[[Resolve]](promise2, x)處理了  
  25.           // 因?yàn)閞esolve里面直接做了,所以直接調(diào)用,和網(wǎng)上的一些實(shí)現(xiàn)有點(diǎn)不一樣  
  26.           // 他們是提取了一個(gè)resolvePromise函數(shù)調(diào)用,我是直接調(diào)用了resolve  
  27.           resolve(value);  
  28.         } catch (e) {  
  29.           reject(e);  
  30.         }  
  31.       });  
  32.     }  
  33.     // 注意這里根據(jù)上面可知onFulfilled,onRejected拋出的值都要經(jīng)過(guò)[[Resolve]](promise2, x)  
  34.     // 這和resolve,reject不一樣,promise中resolve才走[[Resolve]](promise2, x),reject不走  
  35.     if (self.info.status === "onRejected") {  
  36.       setTimeout(() => {  
  37.         try {  
  38.           let { value } = self.info;  
  39.           value = onRejected(self.info.value); 
  40.           resolve(value);  
  41.         } catch (e) {  
  42.           reject(e);  
  43.         }  
  44.       });  
  45.     }  
  46.     // 如果是pending狀態(tài)也需要push  
  47.     if (self.info.status === "pending") {  
  48.       self.onFulfilledArr.push((data) => {  
  49.         setTimeout(() => {  
  50.           try {  
  51.             let value = data 
  52.             value = onFulfilled(value);  
  53.             resolve(value);  
  54.           } catch (e) {  
  55.             reject(e);  
  56.           }  
  57.         });  
  58.       }); 
  59.       self.onRejectedArr.push((data) => {  
  60.         setTimeout(() => {  
  61.           try {  
  62.             let value = data 
  63.             value = onRejected(data);  
  64.             resolve(value);  
  65.           } catch (e) {  
  66.             reject(e); 
  67.            }  
  68.         });  
  69.       });  
  70.     }  
  71.   });  
  72.   return newPromise;  
  73. }; 

小結(jié)

到這里 promise 的主體實(shí)現(xiàn)已經(jīng)完成了,下面是測(cè)試結(jié)果

Promise 其他靜態(tài)方法

Promise.resolve 

  1. PromiseCopy.resolve = function (data) {  
  2.   return new PromiseCopy((resolve, reject) => {  
  3.     resolve(data);  
  4.   });  
  5. }; 

reject 

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

Promise.all

這個(gè)方法有幾個(gè)特點(diǎn)如下

  •  該方法接受一個(gè)數(shù)組,數(shù)組每一個(gè)元素都是一個(gè) promise 對(duì)象
  •  只有所有 promise 都是 onFulfilled 的時(shí)候才會(huì)執(zhí)行 then 回調(diào),并且結(jié)果順序和數(shù)組的一致
  •  如果其中一個(gè) promise 發(fā)生了 reject 那么就會(huì)返回這個(gè)值 
  1. PromiseCopy.all = function (data) {  
  2.   let count = 0; // 記錄調(diào)用次數(shù)  
  3.   let total = data.length;  
  4.   let result = []; 
  5.   return new PromiseCopy((resolve, reject) => {  
  6.     for (let i = 0; i < total; i++) {  
  7.       data[i].then(  
  8.         (res) => {  
  9.           result.push(res);  
  10.           ++count;  
  11.           if (count === totla) {  
  12.             resolve(result);  
  13.           }  
  14.         },  
  15.         (res) => {  
  16.           return reject(res);  
  17.         }  
  18.       );  
  19.     }  
  20.   });  
  21. }; 

Promise.race

這個(gè)方法也有以下幾個(gè)特點(diǎn)

  •  這個(gè)方法也是接受數(shù)組,數(shù)組的元素是 promise
  •  他只返回最快的那一個(gè) promise 的值
  •  就算有錯(cuò)誤也會(huì)返回最快那一個(gè) promise 的值 
  1. PromiseCopy.race = function (data) {  
  2.   const total = data.length;  
  3.   return new PromiseCopy((resolve, reject) => {  
  4.     for (let i = 0; i < total; i++) {  
  5.       data[i].then(  
  6.         (res) => {  
  7.           resolve(res);  
  8.         },  
  9.         (res) => {  
  10.           return reject(res);  
  11.         }  
  12.       );  
  13.     }  
  14.   });  
  15. }; 

catch 方法 

  1. PromiseCopy.prototype.catch = function (onRejected) {  
  2.   // 能到catch里面來(lái)的一定是走的reject的  
  3.   // 而且狀態(tài)一定是pendding  
  4.   const self = this 
  5.   const newnewPromise = new PromiseCopy((resolve, reject) => {  
  6.     if (self.info.status === "onRejected") {  
  7.       try {  
  8.         setTimeout(() => {  
  9.           let { value } = self.info;  
  10.           if (typeof onRejected === "function") {  
  11.             value = onRejected(self.info.value);  
  12.           }  
  13.           resolve(value);  
  14.         });  
  15.       } catch (e) {  
  16.         rejetc(e);  
  17.       } 
  18.     }  
  19.     if (self.info.status === "pending") {  
  20.       self.onRejectedArr.push((data) => {  
  21.         setTimeout(() => {  
  22.           try {  
  23.             let value = data 
  24.             if (typeof onRejected === "function") {  
  25.               value = onRejected(data);  
  26.             }  
  27.             resolve(value);  
  28.           } catch (e) {  
  29.             reject(e);  
  30.           }  
  31.         });  
  32.       });  
  33.     }  
  34.   });  
  35.   return newPromise;  
  36. };  
  37. // 后來(lái)發(fā)現(xiàn)catch有一個(gè)簡(jiǎn)單的實(shí)現(xiàn)方法  
  38. // 沒(méi)有刪除上面就是為了記錄思路過(guò)程  
  39. Promise.prototype.catch = function (onRejected) {  
  40.   return this.then(null, onRejected);  
  41. }; 

deferred

這個(gè)是 Promise 提供的一個(gè)快捷使用,自己實(shí)現(xiàn) promise 的時(shí)候一定要加,不然 promises-aplus-tests promise.js 跑不過(guò) 

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

源碼

promise 源碼已經(jīng)上傳到個(gè)人 github ( https://github.com/yizhengfeng-jj/promise 歡迎 star) 

 

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

2025-03-17 00:21:00

2022-02-11 13:44:56

fiber架構(gòu)React

2021-04-07 20:01:23

Go變量常量

2020-04-28 22:12:30

Nginx正向代理反向代理

2025-04-21 04:00:00

2022-11-11 08:19:03

redis分布式

2022-04-25 09:03:16

JavaScript代碼

2017-07-20 16:55:56

Android事件響應(yīng)View源碼分析

2022-03-26 08:49:13

MySQL數(shù)據(jù)存儲(chǔ)

2017-12-05 17:44:31

機(jī)器學(xué)習(xí)CNN卷積層

2020-10-14 08:50:38

搞懂 Netty 線程

2024-01-03 13:39:00

JS,Javascrip算法

2023-10-18 10:55:55

HashMap

2025-01-13 16:00:00

服務(wù)網(wǎng)關(guān)分布式系統(tǒng)架構(gòu)

2025-04-11 05:55:00

2019-07-23 08:55:46

Base64編碼底層

2019-11-14 05:22:41

Javascript語(yǔ)言this

2019-06-26 06:31:56

緩沖緩沖池查詢(xún)數(shù)據(jù)

2024-06-21 08:32:24

2019-06-24 05:05:40

緩沖池查詢(xún)數(shù)據(jù)InnoDB
點(diǎn)贊
收藏

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