97国产精品视频人人做人人爱,3344在线观看无码,成年人国产视频,欧美日一级片,在线看AV天堂,高清无码一本到东京热,欧美一级黄片一区2区,免费又爽又刺激高潮网址

Promise 你真的用明白了么?

2020-9-2    seo達人

前置知識

在開始正文前,我們先把本文涉及到的一些內容提前定個基調。

Promise 哪些 API 涉及了微任務?

Promise 中只有涉及到狀態變更后才需要被執行的回調才算是微任務,比如說 then、 catch 、finally ,其他所有的代碼執行都是宏任務(同步執行)。

上圖中藍色為同步執行,黃色為異步執行(丟到微任務隊列中)。

這些微任務何時被加入微任務隊列?

這個問題我們根據 ecma 規范來看:

  • 如果此時 Promise 狀態為 pending,那么成功或失敗的回調會分別被加入至 [[PromiseFulfillReactions]] 和 [[PromiseRejectReactions]] 中。如果你看過手寫 Promise 的代碼的話,應該能發現有兩個數組存儲這些回調函數。
  • 如果此時 Promise 狀態為非 pending 時,回調會成為 Promise Jobs,也就是微任務。

了解完以上知識后,正片開始。

同一個 then,不同的微任務執行

初級

Promise.resolve()
  .then(() => { console.log("then1"); Promise.resolve().then(() => { console.log("then1-1");
    });
  })
  .then(() => { console.log("then2");
  });

以上代碼大家應該都能得出正確的答案:then1 → then1-1 → then2

雖然 then 是同步執行,并且狀態也已經變更。但這并不代表每次遇到 then 時我們都需要把它的回調丟入微任務隊列中,而是等待 then 的回調執行完畢后再根據情況執行對應操作。

基于此,我們可以得出第一個結論:鏈式調用中,只有前一個 then 的回調執行完畢后,跟著的 then 中的回調才會被加入至微任務隊列。

中級

大家都知道了 Promise resolve 后,跟著的 then 中的回調會馬上進入微任務隊列。

那么以下代碼你認為的輸出會是什么?

let p = Promise.resolve();

p.then(() => { console.log("then1"); Promise.resolve().then(() => { console.log("then1-1");
  });
}).then(() => { console.log("then1-2");
});

p.then(() => { console.log("then2");
}); 

按照一開始的認知我們不難得出 then2 會在 then1-1 后輸出,但是實際情況卻是相反的。

基于此我們得出第二個結論:每個鏈式調用的開端會首先依次進入微任務隊列。

接下來我們換個寫法:

let p = Promise.resolve().then(() => { console.log("then1"); Promise.resolve().then(() => { console.log("then1-1");
  });
}).then(() => { console.log("then2");
});

p.then(() => { console.log("then3");
});

上述代碼其實有個陷阱,then 每次都會返回一個新的 Promise,此時的 p 已經不是 Promise.resolve() 生成的,而是最后一個 then 生成的,因此 then3 應該是在 then2 后打印出來的。

順便我們也可以把之前得出的結論優化為:同一個 Promise 的每個鏈式調用的開端會首先依次進入微任務隊列。

高級

以下大家可以猜猜 then1-2 會在何時打印出來?

Promise.resolve()
  .then(() => { console.log("then1"); Promise.resolve()
      .then(() => { console.log("then1-1"); return 1;
      })
      .then(() => { console.log("then1-2");
      });
  })
  .then(() => { console.log("then2");
  })
  .then(() => { console.log("then3");
  })
  .then(() => { console.log("then4");
  });

這題肯定是簡單的,記住第一個結論就能得出答案,以下是解析:

  • 第一次 resolve 后第一個 then 的回調進入微任務隊列并執行,打印 then1
  • 第二次 resolve 后內部第一個 then 的回調進入微任務隊列,此時外部第一個 then 的回調全部執行完畢,需要將外部的第二個 then 回調也插入微任務隊列。
  • 執行微任務,打印 then1-1 和 then2,然后分別再將之后 then 中的回調插入微任務隊列
  • 執行微任務,打印 then1-2 和 then3 ,之后的內容就不一一說明了

接下來我們把 return 1 修改一下,結果可就大不相同啦:

Promise.resolve()
  .then(() => { console.log("then1"); Promise.resolve()
      .then(() => { console.log("then1-1"); return Promise.resolve();
      })
      .then(() => { console.log("then1-2");
      });
  })
  .then(() => { console.log("then2");
  })
  .then(() => { console.log("then3");
  })
  .then(() => { console.log("then4");
  });

當我們 return Promise.resolve() 時,你猜猜 then1-2 會何時打印了?

答案是最后一個才被打印出來。

為什么在 then 中分別 return 不同的東西,微任務的執行順序竟有如此大的變化?以下是筆者的解析。

PS:then 返回一個新的 Promise,并且會用這個 Promise 去 resolve 返回值,這個概念需要大家先了解一下。

根據 Promise A+ 規范

根據規范 2.3.2,如果 resolve 了一個 Promise,需要為其加上一個 then 并 resolve

if (x instanceof MyPromise) { if (x.currentState === PENDING) {
  } else {
    x.then(resolve, reject);
  } return;
}

上述代碼節選自手寫 Promise 實現。

那么根據 A+ 規范來說,如果我們在 then 中返回了 Promise.resolve 的話會多入隊一次微任務,但是這個結論還是與實際不符的,因此我們還需要尋找其他權威的文檔。

根據 ECMA - 262 規范

根據規范 25.6.1.3.2,當 Promise resolve 了一個 Promise 時,會產生一個NewPromiseResolveThenableJob,這是屬于 Promise Jobs 中的一種,也就是微任務。

This Job uses the supplied thenable and its then method to resolve the given promise. This process must take place as a Job to ensure that the evaluation of the then method occurs after evaluation of any surrounding code has completed.

并且該 Jobs 還會調用一次 then 函數來 resolve Promise,這也就又生成了一次微任務。

這就是為什么會觸發兩次微任務的來源。

藍藍設計www.0391cbd.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服務

日歷

鏈接

個人資料

藍藍設計的小編 http://www.0391cbd.com

存檔

主站蜘蛛池模板: 久久久久人妻一区精品色奶水| www精品久久| 日本黄网在线观看| 91成人免费观看在线观看| 亚洲天堂视频在线免费观看| 欧美成人精品欧美一级乱黄| 亚洲国产中文在线二区三区免| 人妻无码中文字幕一区二区三区| 国产丝袜精品| 欧美色综合网站| 91在线精品麻豆欧美在线| 亚洲婷婷丁香| 国产丝袜无码一区二区视频| 色老二精品视频在线观看| 国产激情无码一区二区免费| 国产综合无码一区二区色蜜蜜| 伊人久久大香线蕉aⅴ色| 一级毛片视频免费| 麻豆精品在线视频| 高清大学生毛片一级| 国产免费人成视频网| 福利片91| 波多野结衣久久高清免费| 99在线观看国产| 欧美日韩成人在线观看| 国产无码高清视频不卡| 国产后式a一视频| 欧美日韩免费在线视频| 99久久精品免费看国产免费软件| 亚亚洲乱码一二三四区| 免费在线一区| Jizz国产色系免费| 99热这里只有精品免费| 久久综合成人| 亚洲人妖在线| 久热re国产手机在线观看| 特级毛片免费视频| 国产区福利小视频在线观看尤物| 亚洲无限乱码| 国产剧情一区二区| 亚洲91精品视频| 国产99热| 国产熟睡乱子伦视频网站| 国产精品第三页在线看| 色窝窝免费一区二区三区 | AV片亚洲国产男人的天堂| 免费va国产在线观看| 午夜精品久久久久久久无码软件| 国内精自线i品一区202| 精品少妇三级亚洲| 高清大学生毛片一级| 国产欧美视频综合二区| 精品国产毛片| 久久精品波多野结衣| 色婷婷成人网| 久久久噜噜噜久久中文字幕色伊伊 | 中文字幕不卡免费高清视频| 91外围女在线观看| 久草网视频在线| 国产亚洲精品在天天在线麻豆| 午夜无码一区二区三区| 国产精品999在线| 99热这里只有精品免费| 久久一本日韩精品中文字幕屁孩| 国产精品午夜福利麻豆| 欧美日韩一区二区在线免费观看| 91亚洲精品国产自在现线| 亚洲熟女中文字幕男人总站| 亚洲综合久久一本伊一区| 精品黑人一区二区三区| 久久成人18免费| 久久公开视频| 久久久国产精品无码专区| 伊人AV天堂| 欧美一区日韩一区中文字幕页| 91偷拍一区| 欧美国产日韩另类| 67194成是人免费无码| 国产免费看久久久| 国产成人亚洲无码淙合青草| 国产精品19p| 午夜电影在线观看国产1区|