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

2. 說明
JS 中用來存儲(chǔ)待執(zhí)行回調(diào)函數(shù)的隊(duì)列包含 2 個(gè)不同特定的列隊(duì)
- 宏列隊(duì):用來保存待執(zhí)行的宏任務(wù)(回調(diào)),比如:定時(shí)器回調(diào)、DOM 事件回調(diào)、ajax 回調(diào)
- 微列隊(duì):用來保存待執(zhí)行的微任務(wù)(回調(diào)),比如:promise的回調(diào)、MutationObserver 的回調(diào)
JS 執(zhí)行時(shí)會(huì)區(qū)別這 2 個(gè)隊(duì)列
- JS 引擎首先必須先執(zhí)行所有的初始化同步任務(wù)代碼
- 每次準(zhǔn)備取出第一個(gè)宏任務(wù)執(zhí)行前, 都要將所有的微任務(wù)一個(gè)一個(gè)取出來執(zhí)行,也就是優(yōu)先級(jí)比宏任務(wù)高,且與微任務(wù)所處的代碼位置無關(guān)
下面這個(gè)例子可以看出Promise要先于setTimeout執(zhí)行:
setTimeout(() => { //立即放入宏隊(duì)列
console.log('timeout callback1()')
Promise.resolve(3).then(
value => { //立即放入微隊(duì)列
console.log('Promise onResolved3()', value)
}
)
}, 0)
setTimeout(() => { //立即放入宏隊(duì)列
console.log('timeout callback2()')
}, 0)
Promise.resolve(1).then(
value => { //立即放入微隊(duì)列
console.log('Promise onResolved1()', value)
setTimeout(() => {
console.log('timeout callback3()', value)
}, 0)
}
)
Promise.resolve(2).then(
value => { //立即放入微隊(duì)列
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) //會(huì)被忽略,因?yàn)闀?huì)先執(zhí)行微隊(duì)列里的resolve(1),此時(shí)狀態(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)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- JS異步宏隊(duì)列微隊(duì)列原理詳解
- 淺談Vuejs中nextTick()異步更新隊(duì)列源碼解析
- JS異步函數(shù)隊(duì)列功能實(shí)例分析
- JavaScript隊(duì)列函數(shù)和異步執(zhí)行詳解
- JavaScript 異步方法隊(duì)列鏈實(shí)現(xiàn)代碼分析
- JavaScript錯(cuò)誤處理try..catch...finally+涵蓋throw+TypeError+RangeError
- 聊聊Javascript中try catch的2個(gè)作用
- 一分鐘學(xué)會(huì)JavaScript中的try-catch
- 實(shí)例解析js中try、catch、finally的執(zhí)行規(guī)則
- JavaScript異步隊(duì)列進(jìn)行try?catch時(shí)的問題解決
相關(guān)文章
微信小程序?qū)崿F(xiàn)點(diǎn)擊導(dǎo)航標(biāo)簽滾動(dòng)定位到對(duì)應(yīng)位置
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)點(diǎn)擊導(dǎo)航標(biāo)簽滾動(dòng)定位到對(duì)應(yīng)位置,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11
js監(jiān)聽元素是否出現(xiàn)在可視區(qū)域詳解(IntersectionObserver)
這篇文章主要給大家介紹了關(guān)于js監(jiān)聽元素是否出現(xiàn)在可視區(qū)域(IntersectionObserver)的相關(guān)資料, IntersectionObserver是一個(gè)JavaScript API,用于監(jiān)測一個(gè)元素與其父元素或視窗的交叉狀態(tài),需要的朋友可以參考下2024-06-06
使用 Jest 和 Supertest 進(jìn)行接口端點(diǎn)測試實(shí)例詳解
這篇文章主要介紹了使用 Jest 和 Supertest 進(jìn)行接口端點(diǎn)測試,結(jié)合實(shí)例形式詳細(xì)分析了使用 Jest 和 Supertest 進(jìn)行接口端點(diǎn)測試具體原理、操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2020-04-04
JS實(shí)現(xiàn)簡單的二元方程計(jì)算器功能示例
這篇文章主要介紹了JS實(shí)現(xiàn)簡單的二元方程計(jì)算器功能,涉及javascript數(shù)學(xué)運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2017-01-01
Javascript 實(shí)現(xiàn)圖片無縫滾動(dòng)
這篇文章主要介紹了Javascript 實(shí)現(xiàn)圖片無縫滾動(dòng)的相關(guān)資料,需要的朋友可以參考下2014-12-12
JS鏈?zhǔn)秸{(diào)用的實(shí)現(xiàn)方法
程序開發(fā)人員可以使用一些簡單的技術(shù)來改進(jìn)自己的代碼編寫工作。你可以寫一些函數(shù)來處理各種常見任務(wù),以節(jié)省時(shí)間;也可以改進(jìn)一下代碼的實(shí)現(xiàn)方式,比如你可以把方法的鏈?zhǔn)秸{(diào)用技術(shù)用到自己所寫的JS庫中,把自己喜歡的方法串起來調(diào)用。2013-03-03
使用JS正則表達(dá)式 替換括號(hào),尖括號(hào)等
下面小編就為大家?guī)硪黄褂肑S正則表達(dá)式 替換括號(hào),尖括號(hào)等。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-11-11
基于HTML模板和JSON數(shù)據(jù)的JavaScript交互(移動(dòng)端)
這篇文章主要介紹了基于HTML模板和JSON數(shù)據(jù)的JavaScript交互(移動(dòng)端)的相關(guān)資料,需要的朋友可以參考下2016-04-04
js報(bào)錯(cuò) Object doesn''t support this property or method的原因分析
運(yùn)行js是出現(xiàn)Object doesn't support this property or method 錯(cuò)誤的可能原因分析。2011-03-03

