深入理解JS中的微任務(wù)和宏任務(wù)的執(zhí)行順序及應(yīng)用場(chǎng)景
微任務(wù)和宏任務(wù)的區(qū)別及具體場(chǎng)景
微任務(wù)和宏任務(wù)皆為異步任務(wù),它們都屬于一個(gè)隊(duì)列,主要區(qū)別在于他們的執(zhí)行順序,Event Loop的走向和取值。
任務(wù)之間的一些劃分
概念
1.宏觀(guān)任務(wù):當(dāng)前調(diào)用棧中執(zhí)行的代碼成為宏任務(wù)。(主代碼塊、setTimeout、setInterval、I/O、UI 交互事件、setImmediate等等)。
2.微觀(guān)任務(wù): 當(dāng)前(此次事件循環(huán)中)宏任務(wù)執(zhí)行完,在下一個(gè)宏任務(wù)開(kāi)始之前需要執(zhí)行的任務(wù),可以理解為回調(diào)事件。(Promise.then、MutaionObserver、process.nextTick等等)。
3.宏任務(wù)中的事件放在callback queue中,由事件觸發(fā)線(xiàn)程維護(hù);微任務(wù)的事件放在微任務(wù)隊(duì)列中,由js引擎線(xiàn)程維護(hù)。
任務(wù)之間的執(zhí)行順序
宏任務(wù)與微任務(wù)之間的執(zhí)行順序(同步任務(wù)->微任務(wù)->宏任務(wù))
到這里,必須得用代碼來(lái)舉個(gè)例子??給大家展示展示了。
// 代碼塊1 setTimeout(function() { //宏任務(wù)1 console.log('1'); }); new Promise(function(resolve) { console.log('2'); //同步任務(wù)1 resolve(); }).then(function() { //微任務(wù)1 console.log('3'); }); console.log('4'); //同步任務(wù)2 // 代碼塊2 setTimeout(function() { //宏任務(wù)2 console.log('5'); //宏任務(wù)2中的同步任務(wù) new Promise(function(resolve) { console.log('6'); //宏任務(wù)2中的同步任務(wù) new Promise(function(resolve) { //宏任務(wù)2中的微任務(wù) console.log('x1'); resolve(); }).then(function() { console.log('X2'); }); setTimeout(function() { //宏任務(wù)2中的宏任務(wù) console.log('X3'); new Promise(function(resolve) { //宏任務(wù)2中的宏任務(wù)中的同步任務(wù) console.log('X4'); resolve(); }).then(function() { //宏任務(wù)2中的宏任務(wù)中的微任務(wù) console.log('X5'); }); }); resolve(); }).then(function() { //宏任務(wù)2中的微任務(wù) console.log('7'); }); }); // 代碼塊3 setTimeout(function() { //宏任務(wù)3 console.log('8'); }); //(對(duì)于這段代碼node環(huán)境和瀏覽器環(huán)境輸出一致) //輸出答案:2,4,3,1,5,6,x1,x2,7,8,x3,x4,x5
運(yùn)行完結(jié)果,機(jī)智寶寶難免會(huì)想為什么答案會(huì)是這樣的呢,按照同步任務(wù)->微任務(wù)->宏任務(wù)的執(zhí)行順序去檢查,會(huì)慢慢深入人心的。
比較難理解的應(yīng)該是代碼塊2,同步執(zhí)行的按順序執(zhí)行就好了,在輸出同步任務(wù)X1,輸出微任務(wù)X2后,因?yàn)閟etTimeout又是一個(gè)宏任務(wù),所以會(huì)被排到所有的宏任務(wù)之后,所以就會(huì)在7,8的后面出現(xiàn)打印。
那我們?cè)?宏任務(wù)2中的宏任務(wù) X3,X4,X5后面再添加一個(gè)宏任務(wù),最終的結(jié)果會(huì)排列到后面執(zhí)行
setTimeout(function() { //宏任務(wù)2 console.log('5'); //宏任務(wù)2中的同步任務(wù) new Promise(function(resolve) { console.log('6'); //宏任務(wù)2中的同步任務(wù) new Promise(function(resolve) { //宏任務(wù)2中的微任務(wù) console.log('x1'); resolve(); }).then(function() { console.log('X2'); }); setTimeout(function() { //宏任務(wù)2中的宏任務(wù) console.log('X3'); new Promise(function(resolve) { //宏任務(wù)2中的宏任務(wù)中的同步任務(wù) console.log('X4'); resolve(); }).then(function() { //宏任務(wù)2中的宏任務(wù)中的微任務(wù) console.log('X5'); }); }); setTimeout(function() { //宏任務(wù)2中的宏任務(wù) console.log('X6'); new Promise(function(resolve) { //宏任務(wù)2中的宏任務(wù)中的同步任務(wù) console.log('X7'); resolve(); }).then(function() { //宏任務(wù)2中的宏任務(wù)中的微任務(wù) console.log('X8'); }); }); resolve(); }).then(function() { //宏任務(wù)2中的微任務(wù) console.log('7'); }); }); // 5,6,X1,X27,X3,X4,X5,X6,X7,X8
到此這篇關(guān)于深入理解JS中的微任務(wù)和宏任務(wù)的執(zhí)行順序及應(yīng)用場(chǎng)景的文章就介紹到這了,更多相關(guān)JS中的微任務(wù)和宏任務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Javascript this 的一些學(xué)習(xí)總結(jié)
相信有C++、C#或Java等編程經(jīng)驗(yàn)的各位,對(duì)于this關(guān)鍵字再熟悉不過(guò)了。由于Javascript是一種面向?qū)ο蟮木幊陶Z(yǔ)言,它和C++、C#或Java一樣都包含this關(guān)鍵字,接下來(lái)我們將向大家介紹Javascript中的this關(guān)鍵字2012-08-08IE與Firefox在JavaScript上的7個(gè)不同句法分享
盡管那需要用長(zhǎng)串的、沉悶的不同分支代碼來(lái)應(yīng)付不同瀏覽器的日子已經(jīng)過(guò)去,偶爾還是有必要做一些簡(jiǎn)單的區(qū)分和目標(biāo)檢測(cè)來(lái)確保某塊代碼能在用戶(hù)的機(jī)器上正常運(yùn)行2011-10-10JavaScript 浮點(diǎn)數(shù)運(yùn)算 精度問(wèn)題
JavaScript小數(shù)在做四則運(yùn)算時(shí),精度會(huì)丟失,這會(huì)在項(xiàng)目中引起諸多不便,先請(qǐng)看下面腳本。2009-10-10JavaScript 動(dòng)態(tài)將數(shù)字金額轉(zhuǎn)化為中文大寫(xiě)金額
JavaScript 將數(shù)字金額轉(zhuǎn)化為中文大寫(xiě)金額的函數(shù)2009-05-05微信公眾號(hào)H5之微信分享常見(jiàn)錯(cuò)誤和問(wèn)題(小結(jié))
這篇文章主要介紹了微信公眾號(hào)H5之微信分享常見(jiàn)錯(cuò)誤和問(wèn)題(小結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11js css實(shí)現(xiàn)垂直方向自適應(yīng)的三角提示菜單
這篇文章主要為大家詳細(xì)介紹了js css實(shí)現(xiàn)垂直方向自適應(yīng)的三角提示菜單的相關(guān)資料,需要的朋友可以參考下2016-06-06D3.js的基礎(chǔ)部分之?dāng)?shù)組的處理數(shù)組的排序和求值(v3版本)
這篇文章主要介紹了D3.js的基礎(chǔ)部分之?dāng)?shù)組的處理數(shù)組的排序和求值(v3版本) ,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-05-05