150行實現Promise 90%的功能

lqt0223發表於2018-03-02

Promise的實現也算是一個老話題了,網上同型別的文章和示例程式碼不少,其中不乏許多優秀的實現。但因為Promise“魔幻”的API,以及背後包含的非同步處理的獨特思想,使得實現一個Promise仍舊是一個富有挑戰和趣味性的問題。

這裡筆者給出一個自己的實現。為了更好地解釋實現的過程,我把Promise的實現分成了10個階段,並按一個階段一次提交的規則,完成了下面這個程式碼庫

github.com/lqt0223/pro…

這個實現基本覆蓋了Promise的以下功能:

  1. 基本功能:promise是一個物件,它接收一個函式作為引數。當promise被建立時,函式會被立即執行。

  2. 設定非同步操作:可呼叫Promise.prototype.then來設定一些未來完成的操作。當promise物件變成resolved狀態時,在then體中的回撥函式會被呼叫,非同步的值也將被獲取。

  3. 鏈式呼叫:呼叫Promise.prototype.then將返回一個新的promise物件。在promise鏈中,當第一個promise中的步驟開始執行後,這個鏈便會自動地不斷嘗試resolve後續的promise直到結束。

  4. 狀態控制:一個promise物件被建立後,初始狀態為pending,後續會變為resolved或rejected中的任意一種狀態。

  5. 錯誤處理:在promise中處理錯誤有幾種方式:呼叫Promise.prototype.then時傳入錯誤處理函式,或者呼叫Promise.prototype.catch

  6. 錯誤傳遞:當一個位於鏈中的promise狀態變成rejected時,錯誤會向鏈尾部傳遞,直到找到一個錯誤處理函式或catch體。處於reject發生位置和錯誤處理函式之間的非同步操作,將不會被執行。當錯誤被處理後,promise鏈才會恢復執行。

  7. then / catch體中promise的自動解析:當then / catch體中設定的回撥函式返回一個promise時,這個promise將會被自動解析,其產生的值或錯誤也會被傳遞至後續的promise

  8. 異常捕獲:一個promise物件不僅可以被顯式地reject,也可以捕獲其自身執行時丟擲的異常或錯誤。

  9. 靜態方法: Promise.resolve, Promise.reject, Promise.all & Promise.reject

  10. then的多次呼叫: 多次呼叫Promise.prototype.then可以將一些非同步操作設定為併發執行

針對上述功能,程式碼庫中也打上了10個對應的tag,方便切換檢視。

最後,感謝您的star,分享和交流!

相關文章