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