150行實現Promise 90%的功能

Promise的實現也算是一個老話題了,網上同類型的文章和示例代碼很多,其中不乏許多優秀的實現。但由於Promise「魔幻」的API,以及背後包含的異步處理的獨特思想,使得實現一個Promise仍舊是一個富有挑戰和趣味性的問題。git

這裏筆者給出一個本身的實現。爲了更好地解釋實現的過程,我把Promise的實現分紅了10個階段,並按一個階段一次提交的規則,完成了下面這個代碼庫github

github.com/lqt0223/pro…promise

這個實現基本覆蓋了Promise的如下功能:併發

  1. 基本功能:promise是一個對象,它接收一個函數做爲參數。當promise被建立時,函數會被當即執行。異步

  2. 設定異步操做:可調用Promise.prototype.then來設定一些將來完成的操做。當promise對象變成resolved狀態時,在then體中的回調函數會被調用,異步的值也將被獲取。函數

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

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

  5. 錯誤處理:在promise中處理錯誤有幾種方式:調用Promise.prototype.then時傳入錯誤處理函數,或者調用Promise.prototype.catch對象

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

  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,分享和交流!

相關文章
相關標籤/搜索