天天看點

JS魔法堂: Native Promise Only源碼剖析

一, 前言                            

   深入學習Promise的朋友應該都看過<深入了解Promise五部曲>這一系列的文章, 以解除回調地獄之外的觀點來剖析Promise更多的内涵,确實十分精彩.

   NPO(Native Promise Only)是原文作者polyfill的ES6 Promise, 本文為拜讀文章及源碼後的筆記,以便日後查閱.

二, 整體脈絡                          

JS魔法堂: Native Promise Only源碼剖析

 對于Promise實作而言, 主要的主體類型就兩個-----Promise和Thenable. NPO中通過MakeDef建構Promise的内部狀态結構體def, 并且通過def.chain存儲Promise子節點P2-1,P2-2到P2-n, 進而形成一顆Promise樹. 而Thenable的内部狀态結構體def_wrapper則由MakeDefWrapper建構而成.

  Promise樹的結構并不穩定, 實際上每個Promise節點僅與狀态為pending的子節點關聯, 一旦子節點狀态發生變化則斷開關聯.(該部分在 notify() 中實作)

  {Promise} then(success, failure) , 将success和failure事件處理函數與新生成的Promise子節點綁定, 但訂閱的是Promise父節點的狀态變化事件.

  另外NPO中通過建構一個異步執行請求隊列(scheduling_queue),來收集異步執行請求然後對請求作同一處理,并通過門闩(cycle)來防止重複執行異步請求處理操作.

三, 源碼詳解                            

  先看看Promise構造函數, 規定僅能通過new方式來建構Promise執行個體.

JS魔法堂: Native Promise Only源碼剖析
JS魔法堂: Native Promise Only源碼剖析

   Promise的狀态變化放在resolve和reject函數中

JS魔法堂: Native Promise Only源碼剖析
JS魔法堂: Native Promise Only源碼剖析

  下面看一下我覺得最亮眼的地方異步執行請求隊列, 主要由以下幾個部分組成

    1. notify, 周遊def.chain中的所有Promise子節點, 最後由于所有Promise子節的狀态均變為fulfilled或rejected是以清空def.chain.

    2. notifyIsolated, 被notify所調用, 用于單獨調用綁定在每個Promise子節點的success或failure事件處理函數, 并修改Promse子節點的狀态.

    3. scheduling_queue, 存放異步執行請求(以連結清單實作, 對隊列首尾操作性能比數組高).

    4. schedule, 向異步執行請求隊列添加元素, 并發起異步請求處理操作.

      上述的1和2兩點将作為異步執行請求被存放在3中.代碼中各部分則通過4來對隊列和異步執行請求作操作.

JS魔法堂: Native Promise Only源碼剖析
JS魔法堂: Native Promise Only源碼剖析
JS魔法堂: Native Promise Only源碼剖析
JS魔法堂: Native Promise Only源碼剖析

四, 總結                            

如果您覺得本文的内容有趣就掃一下吧!捐贈互勉!

JS魔法堂: Native Promise Only源碼剖析
JS魔法堂: Native Promise Only源碼剖析
JS魔法堂: Native Promise Only源碼剖析

<a href="http://home.cnblogs.com/u/fsjohnhuang/">^_^肥仔John</a>

<a href="http://home.cnblogs.com/u/fsjohnhuang/followees">關注 - 85</a>

<a href="http://home.cnblogs.com/u/fsjohnhuang/followers">粉絲 - 707</a>

<a>+加關注</a>

<a></a>

<a href="http://www.ucancode.com/index.htm" target="_blank">【推薦】超50萬VC++源碼: 大型工控、組态\仿真、模組化CAD源碼2018!</a>

<a href="https://cloud.tencent.com/developer/support-plan?fromSource=gwzcw.710852.710852.710852" target="_blank">【推薦】加入騰訊雲自媒體扶持計劃,免費領取域名&amp;伺服器</a>

JS魔法堂: Native Promise Only源碼剖析

<b>最新IT新聞</b>:

JS魔法堂: Native Promise Only源碼剖析

<b>最新知識庫文章</b>:

<a href="https://github.com/fsjohnhuang" target="_blank">肥仔John@github</a>

作品:

<a href="https://github.com/fsjohnhuang/iScheme" target="_blank">iScheme—Scheme解釋器</a>

<a href="https://github.com/fsjohnhuang/preview" target="_blank">preview.js—純前端的圖檔</a>

繼續閱讀