微任务与宏任务与eventloop
首先我們需要了解一個(gè)概念,在promise執(zhí)行之前是同步任務(wù),再.then和.catch之后變成微任務(wù)
執(zhí)行完同步任務(wù)之后,優(yōu)先執(zhí)行微任務(wù)
執(zhí)行順序是:
同步任務(wù) ==> 微任務(wù) ==>宏任務(wù)
js是單線程的語(yǔ)言,不會(huì)同時(shí)執(zhí)行兩行代碼,當(dāng)我們出現(xiàn)alert彈窗時(shí),是無(wú)法執(zhí)行下面的console.info的
setTimeout(_ => console.log(4))new Promise(resolve => {resolve()console.log(1) }).then(_ => {console.log(3) })console.log(2)通過(guò)上面的了解,此時(shí)應(yīng)該很好得出這道筆試題的答案了
沒(méi)錯(cuò),是1 2 3 4
所有的異步回調(diào)函數(shù),執(zhí)行的結(jié)果會(huì)進(jìn)入一個(gè)隊(duì)列,整個(gè)隊(duì)列就是一個(gè)宏任務(wù);
在博客園里一篇文章就形象的解釋了宏任務(wù)和微任務(wù)的執(zhí)行過(guò)程:
A B C三個(gè)人同時(shí)在銀行某個(gè)柜臺(tái)辦理存錢(qián)業(yè)務(wù)(宏任務(wù)),A在存完錢(qián)之后,沒(méi)有離開(kāi),選擇購(gòu)買(mǎi)理財(cái)和基金(中途產(chǎn)生了微任務(wù)),那么這個(gè)時(shí)候B C必須要在A完成購(gòu)買(mǎi)基金理財(cái)之后,才能執(zhí)行宏任務(wù)
再來(lái)解釋一下eventloop,翻譯過(guò)來(lái)就是事件循環(huán)
每辦理完一個(gè)業(yè)務(wù),柜員就會(huì)問(wèn)當(dāng)前的客戶(hù),是否還有其他需要辦理的業(yè)務(wù)。
(檢查還有沒(méi)有微任務(wù)需要處理)
而客戶(hù)明確告知說(shuō)沒(méi)有事情以后,柜員就去查看后邊還有沒(méi)有等著辦理業(yè)務(wù)的人。
(結(jié)束本次宏任務(wù)、檢查還有沒(méi)有宏任務(wù)需要處理)
這個(gè)檢查的過(guò)程是持續(xù)進(jìn)行的,每完成一個(gè)任務(wù)都會(huì)進(jìn)行一次,而這樣的操作就被稱(chēng)為Event
Loop。(這是個(gè)非常簡(jiǎn)易的描述了,實(shí)際上會(huì)復(fù)雜很多)
借此再?gòu)?fù)習(xí)一下,async/await這種語(yǔ)法糖結(jié)構(gòu)
setTimeout(_ => console.log(4))async function main() {console.log(1)await Promise.resolve()console.log(3) }main()console.log(2)
async函數(shù)在await之前的代碼都是同步執(zhí)行的,
可以理解為await之前的代碼屬于new Promise時(shí)傳入的代碼,
await之后的所有代碼都是在Promise.then中的回調(diào)
總結(jié)
以上是生活随笔為你收集整理的微任务与宏任务与eventloop的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 谈谈我对js中闭包的理解
- 下一篇: 非农数据公布时间