`setTimeout`和`setImmediate`之间的区别

时间:2016-06-23 07:36:48

标签: node.js

nodejs文件说

计划在I / O事件的回调之后以及在触发setTimeout和setInterval设置的计时器之前“立即”执行回调。返回一个immediateObject,可以与clearImmediate一起使用。

但是我写了一个测试代码如下:

server = http.createServer((req, res)->
  res.end()
)

setImmediate(()->
  console.log 'setImmediate'
)

setTimeout(()->
  console.log 'setTimeout'
, 0)
process.nextTick(()->
  console.log 'nextTick'
)

server.listen(8280, ()->
  console.log 'i/o event'
)

为什么setTimeout始终输出befeore setImmediate

2 个答案:

答案 0 :(得分:3)

NodeJS - setTimeout(fn,0) vs setImmediate(fn)

可能重复

SetTimeOut - 此类函数将在设置时间后调用,在您的情况下为0,但它遵循事件循环。并且事件循环不承认它将在0秒后工作。实际上它只保证在完成设定时间后调用函数。

但是,在节点事件队列可以自由占用回调函数的完成时间之后的任何时候都可以调用函数

了解事件循环的来源 - https://www.youtube.com/watch?v=8aGhZQkoFbQ

SetImmediate - 当它进入堆栈时会被调用,并且不会跟踪事件循环中的回调循环。

答案 1 :(得分:0)

与setTimeout()相比,使用setImmediate()的主要好处是,如果在I / O周期内安排了setImmediate(),它将始终在任何计时器之前执行,而与存在的计时器数量无关。

但是,如果在主模块中执行,执行顺序将是不确定的,并取决于流程的性能

有关更多信息,请参见https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/