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 -
注意忙碌的开始和完成之间的漫长间隔,以及似乎没有间隔回调的积压。
浏览器中的 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 -
注意忙碌的开始和完成之间的漫长间隔,以及似乎没有间隔回调的积压。