JS異步宏隊列與微隊列原理區(qū)別詳解
1. 原理圖

2. 說明
JS 中用來存儲待執(zhí)行回調(diào)函數(shù)的隊列包含 2 個不同特定的列隊
- 宏列隊:用來保存待執(zhí)行的宏任務(wù)(回調(diào)),比如:定時器回調(diào)、DOM 事件回調(diào)、ajax 回調(diào)
- 微列隊:用來保存待執(zhí)行的微任務(wù)(回調(diào)),比如:promise的回調(diào)、MutationObserver 的回調(diào)
JS 執(zhí)行時會區(qū)別這 2 個隊列
- JS 引擎首先必須先執(zhí)行所有的初始化同步任務(wù)代碼
- 每次準備取出第一個宏任務(wù)執(zhí)行前, 都要將所有的微任務(wù)一個一個取出來執(zhí)行,也就是優(yōu)先級比宏任務(wù)高,且與微任務(wù)所處的代碼位置無關(guān)
下面這個例子可以看出Promise要先于setTimeout執(zhí)行:
setTimeout(() => { //立即放入宏隊列
console.log('timeout callback1()')
Promise.resolve(3).then(
value => { //立即放入微隊列
console.log('Promise onResolved3()', value)
}
)
}, 0)
setTimeout(() => { //立即放入宏隊列
console.log('timeout callback2()')
}, 0)
Promise.resolve(1).then(
value => { //立即放入微隊列
console.log('Promise onResolved1()', value)
setTimeout(() => {
console.log('timeout callback3()', value)
}, 0)
}
)
Promise.resolve(2).then(
value => { //立即放入微隊列
console.log('Promise onResolved2()', value)
}
)
// Promise onResolved1() 1
// Promise onResolved2() 2
// timeout callback1()
// Promise onResolved3() 3
// timeout callback2()
// timeout callback3() 1
3. 相關(guān)題目
代碼一:
// 3 7 4 1 2 5
/*
宏: []
微: []
*/
const first = () => (new Promise((resolve, reject) => {
console.log(3)
let p = new Promise((resolve, reject) => {
console.log(7)
setTimeout(() => {
console.log(5)
resolve(6) //會被忽略,因為會先執(zhí)行微隊列里的resolve(1),此時狀態(tài)已經(jīng)改變過了,且狀態(tài)只能改變一次
}, 0)
resolve(1)
})
resolve(2)
p.then((arg) => {
console.log(arg)
})
}))
first().then((arg) => {
console.log(arg)
})
console.log(4)
代碼二:
// 1 7 2 3 8 4 6 5 0
setTimeout(() => {
console.log("0")
}, 0)
new Promise((resolve, reject) => {
console.log("1")
resolve()
}).then(() => {
console.log("2")
new Promise((resolve, reject) => {
console.log("3")
resolve()
}).then(() => {
console.log("4")
}).then(() => {
console.log("5")
})
}).then(() => {
console.log("6")
})
new Promise((resolve, reject) => {
console.log("7")
resolve()
}).then(() => {
console.log("8")
})
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- JS異步宏隊列微隊列原理詳解
- 淺談Vuejs中nextTick()異步更新隊列源碼解析
- JS異步函數(shù)隊列功能實例分析
- JavaScript隊列函數(shù)和異步執(zhí)行詳解
- JavaScript 異步方法隊列鏈實現(xiàn)代碼分析
- JavaScript錯誤處理try..catch...finally+涵蓋throw+TypeError+RangeError
- 聊聊Javascript中try catch的2個作用
- 一分鐘學會JavaScript中的try-catch
- 實例解析js中try、catch、finally的執(zhí)行規(guī)則
- JavaScript異步隊列進行try?catch時的問題解決
相關(guān)文章
微信小程序?qū)崿F(xiàn)點擊導航標簽滾動定位到對應(yīng)位置
這篇文章主要為大家詳細介紹了微信小程序?qū)崿F(xiàn)點擊導航標簽滾動定位到對應(yīng)位置,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-11-11
js監(jiān)聽元素是否出現(xiàn)在可視區(qū)域詳解(IntersectionObserver)
這篇文章主要給大家介紹了關(guān)于js監(jiān)聽元素是否出現(xiàn)在可視區(qū)域(IntersectionObserver)的相關(guān)資料, IntersectionObserver是一個JavaScript API,用于監(jiān)測一個元素與其父元素或視窗的交叉狀態(tài),需要的朋友可以參考下2024-06-06
使用 Jest 和 Supertest 進行接口端點測試實例詳解
這篇文章主要介紹了使用 Jest 和 Supertest 進行接口端點測試,結(jié)合實例形式詳細分析了使用 Jest 和 Supertest 進行接口端點測試具體原理、操作技巧與相關(guān)注意事項,需要的朋友可以參考下2020-04-04
基于HTML模板和JSON數(shù)據(jù)的JavaScript交互(移動端)
這篇文章主要介紹了基于HTML模板和JSON數(shù)據(jù)的JavaScript交互(移動端)的相關(guān)資料,需要的朋友可以參考下2016-04-04
js報錯 Object doesn''t support this property or method的原因分析
運行js是出現(xiàn)Object doesn't support this property or method 錯誤的可能原因分析。2011-03-03

