NodeJS setInterval() 是否排队?

Do NodeJS setInterval()s queue up?

浏览器中的 setInterval() 存在一个经典问题 - 如果某些 JS 代码或其他浏览器进程需要很长时间才能完成,则多个回调调用可能会“备份”并且您突然以回调执行多次而结束快速连续的时间。

通常这不是使用 setInterval() 时所需要的。当您希望至少有一些时间间隔在调用之间传递时,这是一个典型的用例。解决方法是改用 setTimeout(),并且仅在上一次调用完成时安排下一次调用。

这很好用,但也是额外的代码,可能会让不了解问题的人感到困惑。

我知道 NodeJS 的工作方式与浏览器不同,但我找不到关于这个特定方面的任何信息。 NodeJS 是否也表现出相同的行为,或者它是否保证使用 setInterval() 时调用之间的最短时间?

看起来像。

start = () => {
  console.log(Date.now(), 'interval started');
  setInterval(() => console.log(Date.now(), '-'), 1000);
}
busy = (n) => {
  console.log(Date.now(), 'busy started');
  for (let i = 1; i < n; i++) Math.sqrt(i, 7);
  console.log(Date.now(), 'busy done');
}

start();
busy(1e10); // this takes a while; nothing is printed, because this keeps the node.js thread busy

输出:

1642469880773 interval started
1642469880776 busy started
1642469888272 busy done
1642469888272 -
1642469889273 -
1642469890274 -

注意忙碌的开始和完成之间的漫长间隔,以及似乎没有间隔回调的积压。