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

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

開(kāi)發(fā) 前端
Promise 處理始終是異步的,因?yàn)樗?promise 行為都會(huì)通過(guò)內(nèi)部的 “promise jobs” 隊(duì)列,也被稱(chēng)為“微任務(wù)隊(duì)列”。

一、前言

Promise 處理始終是異步的,因?yàn)樗?promise 行為都會(huì)通過(guò)內(nèi)部的 “promise jobs” 隊(duì)列,也被稱(chēng)為“微任務(wù)隊(duì)列”。

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

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

代碼如下:

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

如果運(yùn)行它,會(huì)首先看到 code finished,然后才是 promise done。這很奇怪,因?yàn)檫@個(gè) promise 肯定是一開(kāi)始就完成的。

運(yùn)行結(jié)果:

為什么 .then 會(huì)在之后才被觸發(fā)?這是怎么回事?

二、微任務(wù)隊(duì)列(Microtask queue)

1. 如果執(zhí)行順序?qū)苤匾撛趺崔k?

Promise 的處理程序(handler)總是會(huì)經(jīng)過(guò)這個(gè)內(nèi)部隊(duì)列。

如果有一個(gè)包含多個(gè) .then/catch/finally 的鏈,那么它們中的每一個(gè)都是異步執(zhí)行的。也就是說(shuō),它會(huì)首先進(jìn)入隊(duì)列。

然后在當(dāng)前代碼執(zhí)行完成并且先前排隊(duì)的處理程序(handler)都完成時(shí)才會(huì)被執(zhí)行。

2. 怎么才能讓 code finished 在 promise done 之后運(yùn)行呢?

很簡(jiǎn)單,只需要像下面這樣使用 .then 將其放入隊(duì)列:

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

上面代碼,加上這語(yǔ)句就是按照預(yù)期執(zhí)行的。

三、未處理的 rejection

現(xiàn)在,可以確切地看到 JavaScript 是如何發(fā)現(xiàn)未處理的 rejection 的。

如果一個(gè) promise 的 error 未被在微*任務(wù)*隊(duì)列的末尾進(jìn)行處理,則會(huì)出現(xiàn)“未處理的 rejection”。

正常來(lái)說(shuō)。

如果預(yù)期可能會(huì)發(fā)生錯(cuò)誤,會(huì)在 promise 鏈上添加 .catch 來(lái)處理 error:

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

運(yùn)行結(jié)果:

是如果忘記添加 .catch,那么,微任務(wù)隊(duì)列清空后,JavaScript 引擎會(huì)觸發(fā)下面這事件:

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

運(yùn)行結(jié)果:

如果遲一點(diǎn)再處理這個(gè) error 會(huì)怎樣?

例:

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));

現(xiàn)在,如果運(yùn)行上面這段代碼,會(huì)先看到 Promise Failed!,然后才是 caught。

注:

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

當(dāng)微任務(wù)隊(duì)列中的任務(wù)都完成時(shí),才會(huì)生成 unhandledrejection:引擎會(huì)檢查 promise,如果 promise 中的任意一個(gè)出現(xiàn) “rejected” 狀態(tài),unhandledrejection 事件就會(huì)被觸發(fā)。

在上面這個(gè)例子中,被添加到 setTimeout 中的 .catch 也會(huì)被觸發(fā)。只是會(huì)在 unhandledrejection 事件出現(xiàn)之后才會(huì)被觸發(fā)。

四、總結(jié)

本文基于JavaScript基礎(chǔ),介紹了微任務(wù)。其中.then/catch/finally 處理程序(handler),總是在當(dāng)前代碼完成后才會(huì)被調(diào)用。

如果需要確保一段代碼,在 .then/catch/finally 之后被執(zhí)行,可以將它添加到鏈?zhǔn)秸{(diào)用的 .then 中。

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

代碼很簡(jiǎn)單,希望能夠幫助你更好的學(xué)習(xí)。

責(zé)任編輯:華軒 來(lái)源: 前端進(jìn)階學(xué)習(xí)交流
相關(guān)推薦

2021-08-17 09:55:05

JavaScript MicrotaskPromise

2023-09-06 14:57:46

JavaScript編程語(yǔ)言

2021-05-18 08:30:42

JavaScript 前端JavaScript時(shí)

2021-06-24 09:05:08

JavaScript日期前端

2021-01-26 23:46:32

JavaScript數(shù)據(jù)結(jié)構(gòu)前端

2021-03-05 18:04:15

JavaScript循環(huán)代碼

2021-03-09 14:04:01

JavaScriptCookie數(shù)據(jù)

2024-04-19 14:23:52

SwitchJavaScript開(kāi)發(fā)

2023-07-30 15:18:54

JavaScript屬性

2024-01-30 13:47:45

2020-11-10 10:48:10

JavaScript屬性對(duì)象

2021-06-04 09:56:01

JavaScript 前端switch

2021-01-29 18:41:16

JavaScript函數(shù)語(yǔ)法

2021-02-02 18:39:05

JavaScript

2021-08-02 10:01:09

Iterator接口Java項(xiàng)目開(kāi)發(fā)

2021-05-18 09:00:28

Python類(lèi)class

2021-08-30 10:01:01

Map接口HashMap

2021-05-27 09:01:14

Python文件讀寫(xiě)Python基礎(chǔ)

2020-10-20 15:37:48

了解JavaScrip

2020-10-22 09:08:34

JavaScript
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲精品视频在线看 | 久久久91精品国产一区二区三区 | 日本成人一区二区 | 亚洲精品视频免费 | 久久国产精品久久久久 | 黄网站涩免费蜜桃网站 | 国产乱码精品一区二区三区忘忧草 | 久久久久久av | 99精品电影| jlzzjlzz欧美大全 | 亚洲国产中文字幕 | av免费网站在线观看 | 天堂中文在线播放 | 国产精品久久久久久久久久久久久 | 国产视频一区二区三区四区五区 | 国产精品福利在线观看 | 久久不卡| 欧洲国产精品视频 | 日韩理论电影在线观看 | 高清视频一区二区三区 | 久久免费视频网 | 日韩视频免费看 | 蜜臀网站 | 午夜av电影 | 成年人视频在线免费观看 | 午夜精品一区二区三区在线观看 | 国户精品久久久久久久久久久不卡 | av电影手机版 | 亚洲色在线视频 | 国产精品99999 | 日韩欧美在线视频 | 国产蜜臀97一区二区三区 | av免费网站在线观看 | 日韩电影中文字幕 | 国产女人叫床高潮大片免费 | 精品视频久久久 | 亚洲欧美日韩精品久久亚洲区 | 伊伊综合网 | 在线不卡 | 蜜臀网 | 欧美极品少妇xxxxⅹ免费视频 |