Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 为什么要调用process.nextTick()三次?_Node.js_Event Loop - Fatal编程技术网

Node.js 为什么要调用process.nextTick()三次?

Node.js 为什么要调用process.nextTick()三次?,node.js,event-loop,Node.js,Event Loop,如果这幅图是正确的,为什么调用了三次process.nextTick() 有什么区别吗? 在给定阶段调用process.nextTick()时,传递给process.nextTick()的所有回调都将在事件循环继续之前解析 事件循环中有一些短语 在进入下一个阶段之前,事件循环将首先执行所有process.nextTick回调 因此,这取决于调用流程的阶段。nextTick 这里有一个例子 function case1() { setImmediate(() => { proce

如果这幅图是正确的,为什么调用了三次
process.nextTick()

有什么区别吗?

在给定阶段调用process.nextTick()时,传递给process.nextTick()的所有回调都将在事件循环继续之前解析

事件循环中有一些短语

在进入下一个阶段之前,事件循环将首先执行所有
process.nextTick
回调

因此,这取决于调用
流程的阶段。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
  })
}
然后我在读取文件回调中调用它们,以确保它们在同一阶段(轮询阶段)开始

案例1将是

fs.readFile('./package.json', ()=>{
  case1(); 
  //Immediate
  //nextTick
  //timer1
})
案例2

在给定阶段调用process.nextTick()时,传递给process.nextTick()的所有回调都将在事件循环继续之前解析

事件循环中有一些短语

在进入下一个阶段之前,事件循环将首先执行所有
process.nextTick
回调

因此,这取决于调用
流程的阶段。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
  })
}
然后我在读取文件回调中调用它们,以确保它们在同一阶段(轮询阶段)开始

案例1将是

fs.readFile('./package.json', ()=>{
  case1(); 
  //Immediate
  //nextTick
  //timer1
})
案例2

process.nextTick()

这是一个故障保护,用于防止
进程.nextTick()
回调队列完全占用单个可用线程。为了继续尝试尽快清除队列(例如,在下一个滴答声中),将在单个事件循环中多次评估回调

想象一下
process.maxDepth=1
,我们分别调用
process.nextTick()
setimmidate()
十次。所有回调都不会在事件循环的单个勾号中进行计算。
process.nextTick()
回调将在事件循环的三次执行中进行评估,而
setimmidate()
回调将需要整整十个刻度才能完全执行

process.nextTick()

这是一个故障保护,用于防止
进程.nextTick()
回调队列完全占用单个可用线程。为了继续尝试尽快清除队列(例如,在下一个滴答声中),将在单个事件循环中多次评估回调

想象一下
process.maxDepth=1
,我们分别调用
process.nextTick()
setimmidate()
十次。所有回调都不会在事件循环的单个勾号中进行计算。
process.nextTick()
回调将在事件循环的三次执行中进行评估,而
setimmidate()
回调将需要整整十个刻度才能完全执行