Promise 原始碼 靜態方法

2021-09-11 13:39:14 字數 2050 閱讀 8358

最後來看一下 promise 的幾個常用的靜態方法的實現:

注:本次閱讀的是 then/promise 的 4.0.0 版本,原始碼請戳 這裡。

在 4.0.0 版本之中,promise 物件被封裝在了core.js檔案中,常用的靜態方法則寫在了index.js檔案中,開啟 index.js 檔案。

promise.resolve 方法有下面三種使用形式:

promise.resolve(value);

promise.resolve(promise);

promise.resolve(theanable);

複製**

這三種形式都會產生乙個新的 proimse,從而能夠繼續 then 鏈式呼叫。

promise.resolve = function (value) );

}複製**

promise.resolve 的實現,就是 new 乙個新的 promise 例項並呼叫 resolve 方法,最後返回。

promise.reject 與 promise.resolve 同理,只不過將 resolve 替換成 reject。

promise.reject = function (value) );

}複製**

promise.all 可以將傳入的多個 promise 例項裡都 resolve 成功再返回乙個結果陣列。

實現的思路就是用乙個計數器,從零開始計,每當乙個 promise 例項呼叫了 resolve,則 +1。知道計數器等於 promise 例項的數量時,表示全部都執行完了,此時返回結果。

promise.all = function () , reject)

return}}

args[i] = val

if (--remaining === 0)

} catch (ex)

}for (var i = 0; i < args.length; i++)

})}複製**

實現的**裡是做減法,跟計數器做加法思路是一致的。**裡 new 了乙個新的 promise,當觸發了計數器設定的值(即 0),則呼叫它的 resolve,從而觸發 then 函式。

res函式裡,給每乙個 promise 例項繫結乙個 then 方法,當觸發 resolve,即觸發 then,從而再次呼叫res函式。只有傳入的值不再是 promise 例項,此時就用args記錄,作為以後返回的結果陣列。並重新設定計數器remaining(做減法)。

remaining被減到了 0,表示所有傳入的 promise 例項都執行了 resolve,此時可以呼叫新 new 出來的 promise 例項的 resolve 。

promise.race 與 promise.all 相反,只要傳入的多個 promise 例項只要有乙個呼叫了 resolve 就會觸發它的 then 函式。

原始碼是這樣的:

promise.race = function (values) )

});}複製**

**裡也 new 了乙個新的 promise 例項,給傳入的每乙個 promise 例項也都繫結 then 方法。只要有乙個 promise 執行了 then,就直接執行了 resolve。

這裡的 promise.cast 方法是為了返回乙個可以呼叫 then 的 promise 例項。

這裡可以看最新的 原始碼實現 更好理解:

promise.race = function (values) );

});};複製**

看了 promise 的靜態方法原始碼,會發現都是基於之前的一整套 promise 物件來實現的,沒有新的知識點。看起來不好實現的**,卻是這樣幾行**就實現了,是我想複雜了。

不經感慨,芸芸眾生,活到老,學到老啊。

Promise 簡單原始碼

乙個簡單的promise方法執行過程 const promise new promise function resolved,rejusted else 1000 promise.then function res catch function errer 建立乙個建構函式mypromise 傳入乙...

Promise原始碼深入理解

promise的第一版實現 function mypromise constructor function reject reason 捕獲構造異常 try catch e mypromise.prototype.then function onfullfilled,onrejected var p...

簡易版promise原始碼實現

首先我們先看一下promise是如何使用的 通過promise構建出來的物件有三種狀態,pending 進行中 fulfilled 已成功 rejected 已失敗 狀態只能由 pending 變為 fulfilled 或由 pending 變為 rejected 且狀態改變之後不會在發生變化,會一...