Node.js入门:setImmediate() vs setTimeout()

178 阅读3分钟

大家好,我是前端理想哥!

今天是我们Node.js学习的第六节课,这节课我们来聊一聊Node.js 中 setImmediate()setTimeout()的区别,看起来它们好像差不多,但其实它们的执行顺序差别很大!今天我就用简单的代码例子帮大家理清楚这两者的区别,让你在 Node.js 开发中得心应手!

什么是 setTimeout()

首先,看看 setTimeout()。它的作用是设置一个延迟,过了这个时间之后,回调函数就会执行。

比如说,想等 1 秒钟打印个“Hello”:

setTimeout(() => {
  console.log('Hello');
}, 1000);  // 延迟 1 秒后打印 'Hello'

这个 1000 毫秒就代表了延迟时间。当 1 秒钟过去,回调函数就会执行。

什么是 setImmediate()

setImmediate() 又是什么呢?它的作用是在当前事件循环的“检查阶段”结束后立即执行回调函数别急,听起来有点复杂,我们来一步步理解。

首先,setImmediate() 不需要延迟时间。它的回调会在当前事件循环的 I/O 操作完成后,马上执行,而不管定时器的数量是多少。

setTimeout()setImmediate() 执行顺序的不同

这两者最关键的区别就是它们的执行顺序。虽然你可能把它们都设为 0 毫秒,但它们的执行顺序是不一样的!

看这个例子:

setTimeout(() => {
  console.log('Timeout!');
}, 0);

setImmediate(() => {
  console.log('Immediate!');
});

你可能会觉得它们应该是同步执行的,但实际情况是,它们的执行顺序是不确定的!你可能看到 Timeout! 先打印,也可能看到 Immediate! 先打印。这是因为它们的执行是由事件循环控制的,而事件循环的执行阶段非常关键。

放入 I/O 操作中,执行顺序有变化!

那么问题来了,假如我们把 setTimeout()setImmediate() 放到文件读取的回调函数里,它们的顺序会发生变化!

来看这个代码:

const fs = require('fs');

fs.readFile(__filename, () => {
  setTimeout(() => {
    console.log('Timeout!');
  }, 0);

  setImmediate(() => {
    console.log('Immediate!');
  });
});

这时候,不管你给 setTimeout() 设置了多少毫秒,setImmediate() 总是会在 setTimeout() 之前执行

为什么会这样呢?因为当你做 I/O 操作(比如读取文件)时,setImmediate() 会被放到事件循环的“检查阶段”中,确保优先执行

为什么使用 setImmediate() 更好?

  • 当你在 I/O 操作中使用 setImmediate() 时,它的优先级高于 setTimeout() ,这可以确保你的代码在 I/O 操作完成后尽早执行。
  • setTimeout() 适合用于需要等待特定时间后再执行的操作,但它并不会考虑当前事件循环的执行状态。

总结

  • setTimeout() 是按指定的延迟时间来执行回调。
  • setImmediate() 是在事件循环的 I/O 操作完成后,尽快执行回调,特别适合在 I/O 操作中优先执行。

结尾

好了,今天的 Node.js 小知识就分享到这里,大家如果有任何问题,欢迎在评论区留言,我们一起讨论!别忘了点赞、收藏、关注哦!下次见!

如果你也对 Node.js 感兴趣,记得关注理想哥,我们一起深入探索。