node eventloop 问题

setTimeout(() => {
  console.log(1)
  Promise.resolve(3).then(data => console.log(data));
}, 0)

setTimeout(() => {
  console.log(2)
}, 0)

我们知道setTimeout的的回调在timer阶段执行,
然后2个setTimeout 都会被注册到timer阶段

eventloop 检查timer时候,有2个setTimeout 然后执行,
并且第一个setTimeout中的 promise.resolve() 在注册到microTask中,
在timer 阶段结束 执行microTask.

但是这个代码执行
会出现 1 2 3 和 1 3 2 的结果

所以有点不理解为什么会有这两种不同的结果。

阅读 1.4k
1 个回答
Note: When delay is larger than 2147483647 or less than 1, the delay will be set to 1.

timers_settimeout_callback_delay_args

这取决于timer阶段会不会认为第2个timer超时。
然后你可以改成

setTimeout(() => {
    console.log(1)
    Promise.resolve(3).then(data => console.log(data));
}, 0)

setTimeout(() => {
    console.log(2)
}, 0)

let d = Date.now();
while (!(Date.now() - d > 1)) {

}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题