Node.js 中 setimmediate() 和 setTimeout() 的区别

2025年5月2日 | 阅读 5 分钟

在本文中,我们将讨论 Node.js 中 setImmediate()setTimeout() 函数的区别。在讨论它们之间的区别之前,我们必须了解 Node.js 中的 setImmediate() 和 setTimeout() 函数及其语法和示例。

Node.js 中的 Setimmediate() 函数是什么?

Node.js 的 setImmediate() 函数会将一个回调函数安排在当前事件循环周期的末尾执行,但它会在事件循环的“检查”阶段执行。它会推迟当前周期中 I/O 操作的执行。它增加了在执行流程控制之前可能发生的 I/O 或定时器回调的数量,因此这种流程控制可用于推迟低优先级任务。该任务的低优先级有助于提高整体性能,因为它不会阻碍事件循环的其他部分。因此,setImmediate() 函数更适合于报告或清理等操作,这些操作应该等到当前 I/O 周期完成后再执行。
时间可预测性将在所需的所有事件循环迭代中得到维持。

语法

它具有以下语法:

  • 目的: 在事件循环继续到下一次迭代之前,回调函数会在当前迭代的末尾执行,紧接着处理该迭代中队列中所有已安排的输入/输出事件。
  • 执行时机: 事件循环在“检查”阶段运行,该阶段紧随轮询阶段(I/O 操作在此阶段执行)。
  • 用例: 对于可能需要等到当前事件循环迭代的 I/O 操作完成后再执行的任务,使用此函数非常有用。

SetTimeout() 是什么?

Node.js 的 setTimeout() 函数用于安排一个回调函数在预定的毫秒延迟后执行。在事件循环的“定时器”阶段,它会排队回调。回调的执行取决于事件循环的当前状态和任何待处理的活动,即使延迟设置为 0,这也可能导致轻微延迟。当安排必须在特定时间后完成或在其他排队任务后完成的任务时,setTimeout() 是理想的选择。它经常用于通过创建超时、执行定期检查和推迟执行来控制异步进程。

语法

它具有以下语法:

目的

setTimeout() 函数用于在指定的毫秒延迟后计划执行回调函数。它用于为异步进程添加时间延迟。

事件循环的阶段

延迟通过后,回调函数会被排入 Node.js 事件循环的“定时器”阶段。事件循环的状态和其他队列中的任务会影响执行。

延迟参数

延迟以毫秒为单位指定。如果延迟为零,则回调会在较高优先级的任务之后尽快安排。但它不是即时的。

什么是异步性?

由于 setTimeout() 是非阻塞的,因此我们可以在计时器在后台运行时继续处理其他项目。

示例

让我们通过一个例子来说明 Node.js 中的 setImmediate()setTimeout() 函数。

输出

"Start of script."   
"File reading done."  
"Executed via setImmediate" 
"Executed via setTimeout" 

Node.js 中 setImmediate() 和 setTimeout() 函数之间的主要区别

Node.js 中 setImmediate()setTimeout() 函数之间有几个主要区别。以下是一些主要区别:

方面Setimmediate()SetTimeout()
执行时机SetImmediate() 函数将回调安排在当前事件循环阶段结束后的事件循环“检查”阶段执行。它最适合执行应在当前进程完成后立即开始,但在任何进一步的输入/输出事件发生之前执行的操作。它定义了一个以毫秒为单位的等待时间,用于开始执行回调。回调位于事件循环的“定时器”阶段,其执行取决于计时器延迟和事件循环的当前状态。
事件循环中的优先级当 setImmediate() 在 I/O 循环内使用时,它会先执行,因为“检查”阶段紧随 I/O 阶段之后。当 setTimeout() 不在 I/O 循环内时,它会先执行,延迟为 0,因为“定时器”阶段紧随“检查”阶段之前。
用例SetImmediate() 函数最适合需要紧随当前事件循环迭代完成后执行,但不应被计时器机制延迟的操作。SetTimeout() 函数最适合安排具有指定延迟的任务,即使延迟为零。
I/O 操作中的执行优先级SetImmediate() 函数在 I/O 事件处理后(在“检查”阶段)立即执行。它更具可预测性,并优先在“轮询”阶段结束后运行任务。SetTimeout() 函数在当前执行和任何待处理的 I/O 作业之后,等待“定时器”阶段。
延迟为 0 的 setTimeout() 并不是真正的即时执行,并且可能会导致轻微延迟,因为它被安排在“定时器”阶段,该阶段紧随“轮询”阶段。
环境行为由于 SetImmediate() 函数是 Node.js 特有的,因此它可能并非在所有 JavaScript 环境中都可用。setTimeout() 函数是标准 JavaScript 语言的一部分,可在浏览器和 Node.js 中使用。

结论

总之,Node.js 提供了两个函数来控制异步执行的顺序:setImmediate()setTimeout() 函数。setTimeout() 函数之所以被使用,是因为它会安排一个超时;因此,依赖于时间的任务应该使用此函数。相反,由于 setImmediate() 在当前操作完成后(尤其是在 I/O 之后)立即运行回调,因此它是一个立即执行的函数。setTimeout() 函数属于事件循环的定时器阶段,而 setImmediate() 属于其检查阶段。这种区别导致了它们执行时机上的差异。编写响应迅速、可靠且高性能的应用程序需要深入了解 Node.js 的行为和用例,特别是在处理对时间敏感或 I/O 密集型应用程序时。