请教nodejs中promise、setTimeout、setImmediate在eventloop中的执行时机问题

daivon
  • 30

代码如下

setTimeout(() => {
  console.log('timeout1')
  Promise.resolve().then(()=>{
        console.log('reslove1')
    })
}, 0)

setTimeout(() => {
  console.log('timeout2')
  Promise.resolve().then(()=>{
        console.log('reslove2')
    })
}, 0)

setImmediate(()=>{
    console.log('setImmediate1')
})

setImmediate(()=>{
    console.log('setImmediate2')
})

Promise.resolve('resolve3').then((data)=>{
    console.log(data)
})

输出结果如下:

Node.js 中事件循环分为6个阶段,setTimeout在timers阶段执行,setImmediate在check阶段执行

由于settimeout在timers阶段执行顺序不确定,按我的理解,结果有两种

1.settimeout在当前事件循环执行,输出结果:
'timeout1'>'timeout2'>'resolve3'>
'resolve1'>'resolve2'>'setImmediate1'>
'setImmediate2'
2.settimeout在下一个事件循环执行,输出结果:
'resolve3'>'setImmediate1'>'setImmediate2'>
'timeout1'>'timeout2'>'resolve1'>
'resolve2'

为何最后结果为,并且结果很稳定:

'resolve3'>'timeout1'>'timeout2'>
'resolve1'>'resolve2'>'setImmediate1'>
'setImmediate2'

去掉promise之后,输出结果为

跟预期中一样,结果随机,想来重点是promise造成了影响

求各位大牛指教下!!!谢谢!!!

回复
阅读 1.1k
1 个回答

个人理解
事件循环:同步代码>微任务队列(process.nextTick队列>promise队列)>宏任务队列
process.nextTick队列>promise队列>timers队列>i/o队列>check队列,在每个队列里任务执行完后都会再检测微任务队列

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