为什么process.nextTick()调用了三次?

问题描述 投票:0回答:2

confusing diagram of Node event loop

如果这张照片是正确的,为什么process.nextTick()被叫三次?

有什么不同?

node.js event-loop
2个回答
0
投票

Node.js

任何时候在给定阶段调用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
})

0
投票

process.nextTick()评估回调至process.maxDepth

这是一个故障安全措施,可以防止process.nextTick()回调队列完全占用单个可用线程。为了仍然尝试尽可能快地清除队列(例如在下一个滴答中),在单个事件循环中多次评估回调。

想象一下process.maxDepth=1,我们每次打电话给process.nextTick()setImmidiate()十次。所有回调都不会在事件循环的单个刻度中进行评估。 process.nextTick()回调将在事件循环的三次执行中进行评估,而setImmidiate()回调将完整执行十个刻度。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.