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 的结果


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


慕少森
浏览 309回答 1
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)) {}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript