成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一篇文章帶你搞懂JavaScript 微任務(Microtask)

開發 前端
Promise 處理始終是異步的,因為所有 promise 行為都會通過內部的 “promise jobs” 隊列,也被稱為“微任務隊列”。

一、前言

Promise 處理始終是異步的,因為所有 promise 行為都會通過內部的 “promise jobs” 隊列,也被稱為“微任務隊列”。

Promise 的處理程序(handlers).then、.catch 和 .finally 都是異步的。

即便一個 promise 立即被 resolve,.then、.catch 和 .finally ,下面的代碼也會在這些處理程序(handler)之前被執行。

代碼如下:

let promise = Promise.resolve();
promise.then(() => alert("promise done!"));
alert("code finished"); 
// 這個 alert 先顯示

如果運行它,會首先看到 code finished,然后才是 promise done。這很奇怪,因為這個 promise 肯定是一開始就完成的。

運行結果:

為什么 .then 會在之后才被觸發?這是怎么回事?

二、微任務隊列(Microtask queue)

1. 如果執行順序對很重要該怎么辦?

Promise 的處理程序(handler)總是會經過這個內部隊列。

如果有一個包含多個 .then/catch/finally 的鏈,那么它們中的每一個都是異步執行的。也就是說,它會首先進入隊列。

然后在當前代碼執行完成并且先前排隊的處理程序(handler)都完成時才會被執行。

2. 怎么才能讓 code finished 在 promise done 之后運行呢?

很簡單,只需要像下面這樣使用 .then 將其放入隊列:

Promise.resolve()
  .then(() => alert("promise done!")); //規定相對應的順序
  .then(() => alert("code finished"));

上面代碼,加上這語句就是按照預期執行的。

三、未處理的 rejection

現在,可以確切地看到 JavaScript 是如何發現未處理的 rejection 的。

如果一個 promise 的 error 未被在微*任務*隊列的末尾進行處理,則會出現“未處理的 rejection”。

正常來說。

如果預期可能會發生錯誤,會在 promise 鏈上添加 .catch 來處理 error:

let promise = Promise.reject(new Error("Promise Failed!"));
promise.catch(err => alert('caught'));
// 不會運行:error 已經被處理
window.addEventListener('unhandledrejection', event => alert(event.reason));

運行結果:

是如果忘記添加 .catch,那么,微任務隊列清空后,JavaScript 引擎會觸發下面這事件:

let promise = Promise.reject(new Error("Promise Failed!"));
// Promise Failed!
window.addEventListener('unhandledrejection', event => alert(event.reason));

運行結果:

如果遲一點再處理這個 error 會怎樣?

例:

let promise = Promise.reject(new Error("Promise Failed!"));
setTimeout(() => promise.catch(err => alert('caught')), 1000);
// Error: Promise Failed!
window.addEventListener('unhandledrejection', event => alert(event.reason));

現在,如果運行上面這段代碼,會先看到 Promise Failed!,然后才是 caught。

注:

如果并不了解微任務隊列,可能會想:“為什么 unhandledrejection 處理程序(handler)會運行?已經捕獲(catch)并處理了 error!”。

當微任務隊列中的任務都完成時,才會生成 unhandledrejection:引擎會檢查 promise,如果 promise 中的任意一個出現 “rejected” 狀態,unhandledrejection 事件就會被觸發。

在上面這個例子中,被添加到 setTimeout 中的 .catch 也會被觸發。只是會在 unhandledrejection 事件出現之后才會被觸發。

四、總結

本文基于JavaScript基礎,介紹了微任務。其中.then/catch/finally 處理程序(handler),總是在當前代碼完成后才會被調用。

如果需要確保一段代碼,在 .then/catch/finally 之后被執行,可以將它添加到鏈式調用的 .then 中。

在大多數 JavaScript 引擎中(包括瀏覽器和 Node.js),微任務(microtask)的概念與“事件循環(event loop)”和“宏任務(macrotasks)”緊密相關。

代碼很簡單,希望能夠幫助你更好的學習。

責任編輯:華軒 來源: 前端進階學習交流
相關推薦

2021-08-17 09:55:05

JavaScript MicrotaskPromise

2021-05-18 08:30:42

JavaScript 前端JavaScript時

2021-03-09 14:04:01

JavaScriptCookie數據

2024-04-19 14:23:52

SwitchJavaScript開發

2021-03-05 18:04:15

JavaScript循環代碼

2024-01-30 13:47:45

2021-06-24 09:05:08

JavaScript日期前端

2023-09-06 14:57:46

JavaScript編程語言

2021-01-26 23:46:32

JavaScript數據結構前端

2023-07-30 15:18:54

JavaScript屬性

2021-06-04 09:56:01

JavaScript 前端switch

2021-02-02 18:39:05

JavaScript

2020-11-10 10:48:10

JavaScript屬性對象

2021-01-29 18:41:16

JavaScript函數語法

2021-08-30 10:01:01

Map接口HashMap

2021-05-27 09:01:14

Python文件讀寫Python基礎

2021-08-02 10:01:09

Iterator接口Java項目開發

2021-05-18 09:00:28

Pythonclass

2020-10-22 09:08:34

JavaScript

2020-10-27 11:08:01

JavaScript
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久久久国产 | 精品一区二区三区免费视频 | 欧美一区二区在线观看视频 | 国产精品视频导航 | 99中文字幕 | 狠狠婷婷综合久久久久久妖精 | 蜜月aⅴ免费一区二区三区 99re在线视频 | 欧美黄色大片在线观看 | 久久精品伊人 | 91国内外精品自在线播放 | 4h影视 | 九色在线观看 | 国产视频一视频二 | 日本成人中文字幕在线观看 | 成人a视频片观看免费 | 天天玩天天操天天干 | 91av大全 | 久久成人一区 | 成人免费视频一区二区 | 亚洲成人av一区二区 | 欧美成人免费在线 | caoporn视频| 国产精品99视频 | 黄色一级电影在线观看 | 亚洲成av片人久久久 | 成人不卡| 精品亚洲一区二区三区四区五区高 | 在线国产视频 | 亚洲精品99久久久久久 | 亚洲欧洲一区二区 | 日韩av一区二区在线观看 | 亚洲欧美在线观看 | 免费黄色在线观看 | 天堂免费| 欧美日韩在线观看一区 | 在线播放一区二区三区 | 日韩精品一区二区三区中文在线 | 欧美精品综合在线 | 亚洲国产欧美日韩 | 精品国产乱码久久久久久牛牛 | 久久久久国产一区二区三区 |