看代碼:setTimeout(()=>{console.log(1);Promise.resolve().then(()=>{console.log(4);});});Promise.resolve().then(()=>{console.log(2);setTimeout(()=>{console.log(3);});});請(qǐng)輸出上面的執(zhí)行結(jié)果:...瀏覽器的輸出結(jié)果:2143,node的輸出結(jié)果為:2134這樣子就有點(diǎn)疑惑了。。。。2和1的順序能理解,但是4和3的順序,感覺(jué)和自己理解的知識(shí)發(fā)生沖突了,我的理解是代碼從上往下執(zhí)行,將第一個(gè)定時(shí)器,放到事件回調(diào)隊(duì)列中,將第一個(gè)peomise.then放到微任務(wù)中,然后執(zhí)行微任務(wù)中的代碼,先輸出2,然后將第二個(gè)定時(shí)器塞入事件回調(diào)隊(duì)列,此時(shí)主線程空閑,在事件回調(diào)隊(duì)列中取出第一個(gè)定時(shí)器的回調(diào)執(zhí)行,打印1,然后將promise放到微任務(wù)中,此時(shí)就出現(xiàn)分歧了,此時(shí)的主線程或者執(zhí)行棧是從微任務(wù)中取出promise來(lái)執(zhí)行打印4還是取出定時(shí)器的函數(shù)執(zhí)行打印3;從結(jié)果來(lái)看,執(zhí)行棧選擇了打印3,從餓了么團(tuán)隊(duì)的一篇文章中看到這樣一句話,node會(huì)清空當(dāng)前所處階段的隊(duì)列,即執(zhí)行所有task,再去檢查微任務(wù)望解惑,不論是瀏覽器或者node端,按我的思路道理都不通?。?
關(guān)于Promise和setTimeout的執(zhí)行順序,感覺(jué)自己理解的eventloop都是錯(cuò)的
ABOUTYOU
2019-05-09 08:05:14