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