Promise的實現也算是一個老話題了,網上同型別的文章和示例程式碼不少,其中不乏許多優秀的實現。但因為Promise“魔幻”的API,以及背後包含的非同步處理的獨特思想,使得實現一個Promise仍舊是一個富有挑戰和趣味性的問題。
這裡筆者給出一個自己的實現。為了更好地解釋實現的過程,我把Promise的實現分成了10個階段,並按一個階段一次提交的規則,完成了下面這個程式碼庫
這個實現基本覆蓋了Promise的以下功能:
-
基本功能:promise是一個物件,它接收一個函式作為引數。當promise被建立時,函式會被立即執行。
-
設定非同步操作:可呼叫
Promise.prototype.then
來設定一些未來完成的操作。當promise物件變成resolved狀態時,在then體中的回撥函式會被呼叫,非同步的值也將被獲取。 -
鏈式呼叫:呼叫
Promise.prototype.then
將返回一個新的promise物件。在promise鏈中,當第一個promise中的步驟開始執行後,這個鏈便會自動地不斷嘗試resolve後續的promise直到結束。 -
狀態控制:一個promise物件被建立後,初始狀態為pending,後續會變為resolved或rejected中的任意一種狀態。
-
錯誤處理:在promise中處理錯誤有幾種方式:呼叫
Promise.prototype.then
時傳入錯誤處理函式,或者呼叫Promise.prototype.catch
。 -
錯誤傳遞:當一個位於鏈中的promise狀態變成rejected時,錯誤會向鏈尾部傳遞,直到找到一個錯誤處理函式或catch體。處於reject發生位置和錯誤處理函式之間的非同步操作,將不會被執行。當錯誤被處理後,promise鏈才會恢復執行。
-
then / catch體中promise的自動解析:當then / catch體中設定的回撥函式返回一個promise時,這個promise將會被自動解析,其產生的值或錯誤也會被傳遞至後續的promise
-
異常捕獲:一個promise物件不僅可以被顯式地reject,也可以捕獲其自身執行時丟擲的異常或錯誤。
-
靜態方法:
Promise.resolve
,Promise.reject
,Promise.all
&Promise.reject
-
then的多次呼叫: 多次呼叫
Promise.prototype.then
可以將一些非同步操作設定為併發執行
針對上述功能,程式碼庫中也打上了10個對應的tag,方便切換檢視。
最後,感謝您的star,分享和交流!