任何时候在给定阶段调用process.nextTick(),传递给process.nextTick()的所有回调都将在事件循环继续之前解析。
事件循环中有短语,
在输入下一个短语之前,事件循环将首先执行所有process.nextTick
回调。
所以它取决于你称之为process.nextTick
的阶段
这是一个例子
function case1() {
setImmediate(() => {
process.nextTick(() => {
console.log('nextTick')//before going next phase
})
console.log('Immediate')
})
setTimeout(() => {
console.log('timer1') //another phase
})
}
function case2() {
setImmediate(() => {
setImmediate(() => {
console.log('Immediate2') //next event loop
})
console.log('Immediate')
})
setTimeout(() => {
console.log('timer1') //another phase
})
}
然后我在读取文件回调中调用它们以确保它们在相同的阶段(轮询阶段)开始。
const fs = require('fs);
case1将是
fs.readFile('./package.json', ()=>{
case1();
//Immediate
//nextTick
//timer1
})
案例2
fs.readFile('./package.json', ()=>{
case2()
//Immediate
//timer1
//Immediate2
})
process.nextTick()
评估回调至process.maxDepth
这是一个故障安全措施,可以防止process.nextTick()
回调队列完全占用单个可用线程。为了仍然尝试尽可能快地清除队列(例如在下一个滴答中),在单个事件循环中多次评估回调。
想象一下process.maxDepth=1
,我们每次打电话给process.nextTick()
和setImmidiate()
十次。所有回调都不会在事件循环的单个刻度中进行评估。 process.nextTick()
回调将在事件循环的三次执行中进行评估,而setImmidiate()
回调将完整执行十个刻度。