JS異步宏隊(duì)列微隊(duì)列原理詳解
先看一張我繪制的原理圖

原理圖
setImmediate 也是宏任務(wù),在 Node 環(huán)境下,微任務(wù)還有 process.nextTick
JS 中用來(lái)存儲(chǔ)待執(zhí)行回調(diào)函數(shù)的隊(duì)列包含 2 個(gè)不同特定的列隊(duì)
宏列隊(duì):用來(lái)保存待執(zhí)行的宏任務(wù)(回調(diào)),比如:定時(shí)器回調(diào)、DOM 事件回調(diào)、ajax 回調(diào)微 列隊(duì):用來(lái)保存待執(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è)取出來(lái)執(zhí)行,也就是優(yōu)先級(jí)比宏任務(wù)高,且與微任務(wù)所處的代碼位置無(wú)關(guān)下面這個(gè)例子可以看出 Promise 要先于 setTimeout 執(zhí)行
setTimeout(() => { // 立即放入宏隊(duì)列 console.log(’settimeout callback1()’);}, 0);setTimeout(() => { // 立即放入宏隊(duì)列 console.log(’settimeout callback2()’);}, 0);Promise.resolve(1).then(value => { // 立即放入微隊(duì)列 console.log(’Promise onResolved1()’, value);})Promise.resolve(2).then(value => { // 立即放入微隊(duì)列 console.log(’Promise onResolved2()’, value);})// Promise onResolved1() 1// Promise onResolved2() 2// settimeout callback1()// settimeout callback2()
全文完。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. Java commons-httpclient如果實(shí)現(xiàn)get及post請(qǐng)求2. 一文帶你徹底理解Java序列化和反序列化3. JS中6個(gè)對(duì)象數(shù)組去重的方法4. Python基于requests庫(kù)爬取網(wǎng)站信息5. vscode運(yùn)行php報(bào)錯(cuò)php?not?found解決辦法6. python中文本字符處理的簡(jiǎn)單方法記錄7. PHP laravel實(shí)現(xiàn)導(dǎo)出PDF功能8. Python使用Selenium自動(dòng)進(jìn)行百度搜索的實(shí)現(xiàn)9. PHP利用curl發(fā)送HTTP請(qǐng)求的實(shí)例代碼10. 資深程序員:給Python軟件開(kāi)發(fā)測(cè)試的25個(gè)忠告!

網(wǎng)公網(wǎng)安備