返回

两分钟了解Event Loop: setTimeout vs setImmediate

前端

在 JavaScript 中,setTimeout 和 setImmediate 都是用来延迟执行函数的定时函数。它们都有一个共同点,那就是都是非阻塞的,即不会阻塞当前执行的代码。

但是,这两者之间还是有一些区别的。最主要的区别是,setImmediate 的优先级高于 setTimeout(fn, 0)。这意味着,如果同时调用这两个函数,setImmediate 会先执行,然后再执行 setTimeout(fn, 0)。

为什么会这样呢?

这是因为 setImmediate 是由 Node.js 的 Event Loop 来执行的,而 setTimeout(fn, 0) 是由浏览器来执行的。Node.js 的 Event Loop 的优先级高于浏览器的 Event Loop,所以 setImmediate 会先执行。

为了更好地理解这一点,我们可以通过一个代码示例来说明。

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

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

// 输出:
// setImmediate
// setTimeout

在这个代码示例中,我们同时调用了 setTimeout(fn, 0) 和 setImmediate(),并且将它们的回调函数都设置为在 0 毫秒后执行。按照我们的预期,这两个函数应该同时执行。

但是,实际输出结果却是,setImmediate() 先执行,然后才是 setTimeout(fn, 0)。这是因为 setImmediate() 是由 Node.js 的 Event Loop 来执行的,而 setTimeout(fn, 0) 是由浏览器来执行的。Node.js 的 Event Loop 的优先级高于浏览器的 Event Loop,所以 setImmediate() 会先执行。

除了优先级不同之外,setTimeout 和 setImmediate 还有一些其他的区别。

  • setTimeout(fn, 0) 是一个全局函数,可以在任何地方使用。而 setImmediate() 是一个 Node.js 特有的函数,只能在 Node.js 环境中使用。
  • setTimeout(fn, 0) 的最小延迟时间是 4 毫秒,而 setImmediate() 的最小延迟时间是 0 毫秒。这意味着,setImmediate() 可以比 setTimeout(fn, 0) 更快地执行。
  • setTimeout(fn, 0) 可以接受多个参数,而 setImmediate() 只接受一个参数。

总之,setTimeout 和 setImmediate 是 JavaScript 中常用的两个定时函数,它们都有自己的特点和适用场景。开发者在使用时,需要根据自己的实际需求来选择合适的函数。