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

时间:2018-09-13 03:09:15

标签: node.js event-loop

confusing diagram of Node event loop

如果这张图片正确,为什么 <com.twitter.sdk.android.core.identity.TwitterLoginButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" android:id="@+id/bt_conectarTwitter"/> 被叫三遍?

有什么区别?

2 个答案:

答案 0 :(得分: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
})

case2

fs.readFile('./package.json', ()=>{
  case2()
  //Immediate
  //timer1
  //Immediate2
})

答案 1 :(得分:0)

  

process.nextTick()评估最多process.maxDepth的回调

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

想象process.maxDepth=1,我们分别叫process.nextTick()setImmidiate()十次。在事件循环的单个滴答声中不会评估所有回调。 process.nextTick()回调将在事件循环的三个执行中进行评估,而setImmidiate()回调将需要十个滴答声才能完全执行。