为了账号安全,请及时绑定邮箱和手机立即绑定

关于Promise和setTimeout的执行顺序,感觉自己理解的eventloop都是错的

关于Promise和setTimeout的执行顺序,感觉自己理解的eventloop都是错的

胡说叔叔 2019-01-28 11:15:48
看代码: 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端,按我的思路道理都不通啊?
查看完整描述

1 回答

?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

setImmediate(() => {
console.log(1);

process.nextTick(() => {

console.log(4);

});
});

process.nextTick(() => {
console.log(2);

setImmediate(() => {

console.log(3);

});
});
这段代码是那遍文章里面提到的, 文章说是输出 2134
但是你会发现把它扔到node的最新版中输出是 2143
旧一点的版本是 2134 这个表明node的异步执行机制已经改了,不是文章所说那样了


查看完整回答
反对 回复 2019-01-28
  • 1 回答
  • 0 关注
  • 565 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信