JS關(guān)于Promise和async await
復習Promise這塊 對于消息隊列,宏任務,微任務這塊的個人理解,有問題還請各位大佬指正
Promise
運行結(jié)果:
1
2
10
5
6
8
9
3
個人理解:微任務的優(yōu)先級比宏任務優(yōu)先級高,當微任務沒有的時候會執(zhí)行宏任務,存在微任務時,執(zhí)行完一個宏任務,會優(yōu)先執(zhí)行微任務
timeOut2進入宏任務 [timeOut2] [[]] 控制臺輸出:
執(zhí)行console.log(1),[timeOut2] [[]] 控制臺輸出:1
p1的狀態(tài)變?yōu)閞esolve,[timeOut2] [[]] 控制臺輸出:1
執(zhí)行console.log(2),[timeOut2] [[]] 控制臺輸出:1,2
timeOut1進入宏任務 [timeOut2,timeOut1] [[]] 控制臺輸出:1,2
p2的狀態(tài)變?yōu)閞esolve,控制臺輸出:1,2
p2.then加入微任務 [timeOut2,timeOut1] [[p2.then]] 控制臺輸出:1,2
p1.then加入微任務 [timeOut2,timeOut1] [[p2.then,p1.then]] 控制臺輸出:1,2
執(zhí)行console.log(10) [timeOut2,timeOut1] [[p2.then,p1.then]] 控制臺輸出:1,2,10
執(zhí)行p2.then ?[timeOut2,timeOut1] [[p1.then]] 控制臺輸出:1,2,10,5
執(zhí)行p1.then ?[timeOut2,timeOut1] [[]] 控制臺輸出:1,2,10,5,6
執(zhí)行timeOut2 ?,執(zhí)行console.log(8),p3狀態(tài)變?yōu)閞esolve,p3.then加入微任務。[timeOut1] [[p3.then]] 控制臺輸出:1,2,10,5,6,8
執(zhí)行微任務p3.then [timeOut1] [[]] 控制臺輸出:1,2,10,5,6,8,9
執(zhí)行timeOut1 控制臺輸出:1,2,10,5,6,8,9,3
async await
運行結(jié)果:
script start
async2 end
Promise
script end
async2 end1
promise1
promise4
promise2
async1 end
promise3
setTimeout
個人理解:執(zhí)行完await 時 會先把他的then加入微任務 ?他的then執(zhí)行完 再執(zhí)行后面的
執(zhí)行console.log('script start'),[] [[]] 控制臺輸出:script start
進入async1,在進入async2,執(zhí)行console.log('async2 end') async2 end1進入微任務 [] [[async2 end1]] 控制臺輸出:script start,async2 end
當async2 end1的then執(zhí)行完 ?async1 end才會進入微任務
setTimeout進入宏任務 ?[setTimeout] [[async2 end1]] 控制臺輸出:script start,async2 end
執(zhí)行console.log('Promise'),promise1進入微任務 ?[setTimeout] [[async2 end1,promise1]] ?控制臺輸出:script start,async2 end,Promise
promise4進入微任務 [setTimeout] [[async2 end1,promise1,promise4]] 控制臺輸出:script start,async2 end,Promise
console.log('script end') ? ?[setTimeout] [[async2 end1,promise1,promise4]] 控制臺輸出:script start,async2 end,Promise,script end
執(zhí)行async2 end1 ?async2()的then進入微任務 ? [setTimeout] [[promise1,promise4,v]] 控制臺輸出:script start,async2 end,Promise,script end,async2 end1
執(zhí)行promise1。promise2進入微任務 [setTimeout] [[promise4,v,promise2]] 控制臺輸出:script start,async2 end,Promise,script end,async2 end1,promise1
執(zhí)行promise4。 ?[setTimeout] [[v,promise2]] 控制臺輸出:script start,async2 end,Promise,script end,async2 end1,promise1,promise4
執(zhí)行v, [setTimeout] [[promise2,async1 end]] 控制臺輸出:script start,async2 end,Promise,script end,async2 end1,promise1,promise4
執(zhí)行promise2。[setTimeout] [[async1 end,promise3]] 控制臺輸出:script start,async2 end,Promise,script end,async2 end1,promise1,promise4,promise2
執(zhí)行async1 end [setTimeout] [[promise3]] 控制臺輸出:script start,async2 end,Promise,script end,async2 end1,promise1,promise4,promise2,async1 end
執(zhí)行promise3 ?控制臺輸出:script start,async2 end,Promise,script end,async2 end1,promise1,promise4,promise2,async1 end,promise3
執(zhí)行setTimeout。最后輸出:script start,async2 end,Promise,script end,async2 end1,promise1,promise4,promise2,async1 end,promise3,setTimeout