微任務與宏任務的區別

類比去銀行辦業務,對於櫃員來說,每一個來辦理業務的人就可以認爲是他的一個宏任務,當櫃員處理完當前客戶的問題以後,選擇接待下一位,廣播報號,也就是下一個宏任務的開始。
所以多個宏任務合在一起就可以認爲說有一個任務隊列在這,裏邊是當前銀行中所有排號的客戶。
任務隊列中的都是已經完成的異步操作,而不是說註冊一個異步任務就會被放在這個任務隊列中,就像在銀行中排號,如果叫到你的時候你不在,那麼你當前的號牌就作廢了,櫃員會選擇直接跳過進行下一個客戶的業務處理,等你回來以後還需要重新取號。

而且一個宏任務在執行的過程中,是可以添加一些微任務的,就像在櫃檯辦理業務,你前邊的一位老大爺可能在存款,在存款這個業務辦理完以後,櫃員會問老大爺還有沒有其他需要辦理的業務,老大爺然後告訴櫃員說,還要辦一些理財的業務,這時候櫃員肯定不能告訴老大爺說:“您再上後邊取個號去,重新排隊”。
所以本來快輪到你來辦理業務,會因爲老大爺臨時添加的“理財業務”而往後推。也許老大爺在辦完理財以後還想 再辦一個信用卡?或者 再買點兒紀念幣
無論是什麼需求,只要是櫃員能夠幫她辦理的,都會在處理你的業務之前來做這些事情,這些都可以認爲是微任務。

在當前的微任務沒有執行完成時,是不會執行下一個宏任務的。

有一個經典面試題:

setTimeout(_ => console.log(4))

new Promise(resolve => {
  resolve()
  console.log(1)
}).then(_ => {
  console.log(3)
})

console.log(2)

setTimeout就是作爲宏任務來存在的,而Promise.then則是具有代表性的微任務,上述代碼的執行順序就是按照序號來輸出的。

所有會進入的異步都是指的事件回調中的那部分代碼
也就是說new Promise在實例化的過程中所執行的代碼都是同步進行的,而then中註冊的回調纔是異步執行的。
在同步代碼執行完成後纔回去檢查是否有異步任務完成,並執行對應的回調,而微任務又會在宏任務之前執行。
所以就得到了上述的輸出結論1、2、3、4

宏任務:setTimeout,setInterval

微任務:promise.then,try catch finally

發佈了49 篇原創文章 · 獲贊 19 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章