今天看到了一段代码:
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:nextTick
在promise.then
之前输出,但是为什么nextTick in promise
会排在3 和6之后呢?
我的理解:开始执行第一个then
回调,首先打印promise1
,遇到nextTick in promise
,将其放入微任务队列。此时的微任务队列应该有两个待执行任务:nextTick in promise
以及promise 2
,如果说nextTick
优先级更高,那么不应该优先输出nextTick in promise
吗?
求解答
因该是在 promises 微任务队列完成后,Event loop才会再次检测到 process.nextTick 队列中有一项被添加