node.js - `setTimeout` 和 `setImmediate` 之间的区别

标签 node.js

nodejs 文档说

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

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

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总是在 setImmediate 之前输出

最佳答案

SetTimeOut - 这种类型的函数将在设定时间后调用,在您的情况下为 0,但它遵循事件循环。并且事件循环并不保证它会在 0 秒后起作用。事实上它只保证函数在完成设定的时间后被调用。

但是,当 Node 事件队列空闲以占用回调函数时,函数可以在完成时间后随时调用

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

SetImmediate - 这将在进入堆栈时被调用,并且不遵循事件循环中的回调周期。

关于node.js - `setTimeout` 和 `setImmediate` 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37985065/

相关文章:

node.js - Mongoose 默认值是否应用于现有文档?

javascript - 如何使用两个预定义值绑定(bind) HTML 中的选择选项以在 mongodb 中插入数据

Node.js IPv6 问题

javascript - 为什么这个 promise 被拒绝了?

javascript - 从十六进制哈希生成范围内的 float

node.js - 使用 mocha 进行 Node-Redis 异步测试

javascript - 多次触发回调,我不明白为什么

javascript - For循环在传递给函数之前递增到限制

javascript - 无法在 Sails JS 中创建版本化 API

c# - NodeJS 3DES ECB 加密不等于 C# 加密