看代码:
setTimeout(() => { console.log(1); Promise.resolve().then(() => { console.log(4); }); }); Promise.resolve().then(() => { console.log(2); setTimeout(() => { console.log(3); }); });
请输出上面的执行结果:...
浏览器的输出结果:2 1 4 3,
node的输出结果为: 2 1 3 4
这样子就有点疑惑了。。。。
2和1的顺序能理解,但是 4和3的顺序,感觉和自己理解的知识发生冲突了,
我的理解是 代码从上往下执行,
将第一个定时器,放到事件回调队列中,
将第一个peomise.then放到微任务中,
然后执行微任务中的代码,先输出2,
然后将第二个定时器塞入事件回调队列,
此时主线程空闲,在事件回调队列中取出第一个定时器的回调执行,打印1,
然后将promise放到微任务中,
此时就出现分歧了,此时的主线程或者执行栈是从微任务中取出promise来执行打印4还是取出定时器的函数执行打印3;
从结果来看,执行栈选择了打印3,
从饿了么团队的一篇文章中看到这样一句话,node会清空当前所处阶段的队列,即执行所有task,再去检查微任务
望解惑,不论是浏览器或者node端,按我的思路道理都不通啊?
qq_花开花谢_0
相关分类