关于nexttick和Promise的优先级?

今天看到了一段代码:

console.log('1: script start')

setTimeout(function() {
  console.log('2: setTimeout')
}, 0)

Promise.resolve()
  .then(function() {
    console.log('3: promise1')
    process.nextTick(() => {
      console.log('4: nextTick in promise')
    })
    setTimeout(function() {
      console.log('5: setTimeout in promise')
    }, 0)
  })
  .then(function() {
    console.log('6: promise2')
  })

process.nextTick(() => {
  console.log('7: nextTick')
})

console.log('8: script end')

输出是

1: script start
8: script end
7: nextTick
3: promise1
6: promise2
4: nextTick in promise
2: setTimeout
5: setTimeout in promise

根据node中nextTick要比promise.then的优先级高这样一个原则,我可以理解7:nextTickpromise.then之前输出,但是为什么nextTick in promise会排在36之后呢?

我的理解:开始执行第一个then回调,首先打印promise1,遇到nextTick in promise,将其放入微任务队列。此时的微任务队列应该有两个待执行任务:nextTick in promise以及promise 2,如果说nextTick优先级更高,那么不应该优先输出nextTick in promise吗?

求解答

阅读 3.3k
3 个回答

因该是在 promises 微任务队列完成后,Event loop才会再次检测到 process.nextTick 队列中有一项被添加

首先确实是微任务与宏任务, nextTick也确实是微任务. 但是我们要看到Promise.resolve()是同步任务,虽然resolve调用了,执行了但是整体代码还没执行完,无法进入Promise.then 流程 也就是说这时.then是不执行的, 然后将'7: nextTick'载入任务列表此时的顺序就是image.png
然后.then执行就是promise1---> 任务列表加入4: nextTick in promise'但不执行--->promise2, promise2也执行后此时微任务只有一个4: nextTick in promise, 之后就是两个宏任务了

他两个同为微任务, 依然是哪个先入栈哪个先执行的

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