最後來看一下 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 且狀態改變之後不會在發生變化,會一...