成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

淺析es6-promise源碼

fox_soyoung / 1315人閱讀

摘要:主要邏輯本質(zhì)上還是回調(diào)函數(shù)那一套。通過的判斷完成異步和同步的區(qū)分。

主要邏輯:

本質(zhì)上還是回調(diào)函數(shù)那一套。
通過_subscribers的判斷完成異步和同步的區(qū)分。
通過 resolve,reject -> publish -> invokeCallback -> resolve,reject的遞歸和下一條then的parent是上一條的child來完成then鏈的流轉(zhuǎn)

同步情況下函數(shù)流轉(zhuǎn): constructor -> resolver -> publish -> then -> invokeCallback
異步情況下函數(shù)流轉(zhuǎn): constructor -> then -> resolver -> publish -> invokeCallback

主要函數(shù)解析

1. constructor
作用: 把resolve,reject綁定到 resolver上-

constructor(resolver) {
    this[PROMISE_ID] = nextId();
    this._result = this._state = undefined;
    this._subscribers = [];
    
    if (noop !== resolver) {
      typeof resolver !== "function" && needsResolver();
      
      this instanceof Promise ? initializePromise(this, resolver) : needsNew();
    }
  }

2 then
作用: 把回調(diào)函數(shù)綁定在_subscribers上,catch和finally本質(zhì)是then的語法糖
_subscribers的參數(shù)是一個數(shù)組,[0]是他的child,綁定下一個then鏈的parent,用于publish遞歸調(diào)用, 第二個是resolve 回調(diào), 第三個是reject回調(diào)

export default function then(onFulfillment, onRejection) {
  const parent = this;
  
  const child = new this.constructor(noop);

  if (child[PROMISE_ID] === undefined) {
    makePromise(child);
  }

  const { _state } = parent;
 
  if (_state) {
    const callback = arguments[_state - 1];
    asap(() => invokeCallback(_state, child, callback, parent._result));
  } else {
    subscribe(parent, child, onFulfillment, onRejection);
  }

  return child;
}

3 publish
作用: resolve,reject的觸發(fā)會調(diào)用publish,publish繼續(xù)調(diào)用invokeCallback,通過返回值繼續(xù)調(diào)用resolve,reject,形成一個遞歸,完成then鏈的流轉(zhuǎn)

function publish(promise) {
  let subscribers = promise._subscribers;
  let settled = promise._state;

  if (subscribers.length === 0) { return; }

  let child, callback, detail = promise._result;

  for (let i = 0; i < subscribers.length; i += 3) {
    child = subscribers[i];
    callback = subscribers[i + settled];

    if (child) {
      invokeCallback(settled, child, callback, detail);
    } else {
      callback(detail);
    }
  }

  promise._subscribers.length = 0;
}

tip:
finally的callback是沒有返回參數(shù)的,基于

return promise.then(value => constructor.resolve(callback()).then(() => value),
                         reason => constructor.resolve(callback()).then(() => { throw reason; }));

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/102845.html

相關(guān)文章

  • es6-promise

    摘要:是什么可以理解為一個承諾,如果調(diào)用,返回一個承諾給,然后就可以在寫計劃的時候這么寫,當(dāng)返回結(jié)果的時候,就執(zhí)行方案,如果沒有返回要的結(jié)果,就執(zhí)行方案。這樣一來,所有的潛在風(fēng)險就都在的可控范圍之內(nèi)了。 promise是什么 Promise可以理解為一個承諾,如果A調(diào)用B,B返回一個承諾給A,然后A就可以在寫計劃的時候這么寫,當(dāng)B返回結(jié)果的時候,A就執(zhí)行方案1,如果B沒有返回A要的結(jié)果,A就...

    jackwang 評論0 收藏0
  • 使用Vue構(gòu)建中(大)型應(yīng)用

    摘要:做前端路由管理,一個中大型項目必須要做路由管理做數(shù)據(jù)管理,類似于的存在,沒有,中大型應(yīng)用中的狀態(tài)會把開發(fā)者搞死,絕對。 想做SPA就快上車! init 首先要起一個項目,推薦用vue-cli安裝 $ npm install -g vue-cli $ vue init webpack demo $ cd demo $ npm install demo是這個示例項目的名字 現(xiàn)在看到目錄結(jié)構(gòu)...

    Rindia 評論0 收藏0
  • 淺析webpack源碼之前言(一)

    為什么讀webpack源碼 因為前端框架離不開webpack,天天都在用的東西啊,怎能不研究 讀源碼能學(xué)到很多做項目看書學(xué)不到的東西,比如說架構(gòu),構(gòu)造函數(shù),es6很邊緣的用法,甚至給函數(shù)命名也會潛移默化的影響等 想寫源碼,不看源碼怎么行,雖然現(xiàn)在還不知道寫什么,就算不寫什么,看看別人寫的總可以吧 知道世界的廣闊,那么多插件,那么多軟件開發(fā)師,他們在做什么,同樣是寫js的,怎么他們能這么偉大 好奇...

    suosuopuo 評論0 收藏0
  • 淺析HashMap源碼(1)

    摘要:前言本文的目的是閱讀理解的源碼,作為集合中重要的一個角色,平時用到十分多的一個類,深入理解它,知其所以然很重要。 前言 本文的目的是閱讀理解HashMap的源碼,作為集合中重要的一個角色,平時用到十分多的一個類,深入理解它,知其所以然很重要。本文基于Jdk1.7,因為Jdk1.8改變了HashMap的數(shù)據(jù)結(jié)構(gòu),進(jìn)行了優(yōu)化,我們先從基礎(chǔ)閱讀,之后再閱讀理解Jdk1.8的內(nèi)容 HashMa...

    wwolf 評論0 收藏0
  • 淺析`redux-thunk`中間件源碼

    摘要:大多的初學(xué)者都會使用中間件來處理異步請求,其理解簡單使用方便具體使用可參考官方文檔。源碼的源碼非常簡潔,出去空格一共只有行,這行中如果不算上則只有行。官方文檔中的一節(jié)講解的非常好,也確實幫我理解了中間件的工作原理,非常推薦閱讀。 總覺得文章也應(yīng)該是有生命力的,歡迎關(guān)注我的Github上的博客,這里的文章會依據(jù)我本人的見識,逐步更新。 大多redux的初學(xué)者都會使用redux-thunk...

    wing324 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<