NodeJ的setInterval而不延长过程寿命

Col*_*ber 1 javascript asynchronous settimeout setinterval node.js

我简化了它以更好地了解我的需要:我要做的任务是,我们有一个漫长的未知的nodejs进程(有很多排队的异步函数,我们不知道它们何时完成或类似的工作),并且想要有一个更新过程,我们将当前过程状态存储在数据库中。为此,我们有一个启动(它存储“开始”),一个结束过程位于之上process.on('beforeExit', function () { ... });。现在,我们必须处理客户要求的“仍在运行”过程。为此,我们想每十分钟更新一次带有时间戳的运行状态(此函数已经存在,并且称为state.setRunningState()

现在我有一个问题,我如何每十分钟触发一次该功能。为此,我打算在工作过程的每个事件上触发此函数,并比较它是否早于10分钟。问题是:有时会有更多的时间没有任何事件。所以第二个选择是setInterval(),这就是我的问题:如果我使用setInterval,我的nodejs进程将永远不会结束,因此该进程将无限运行直到清除Interval。但我也不知道该何时打电话clearInterval()

所以问题是:有没有一种方法可以创建这样的超时而不延长nodejs进程的生存时间。如果一切都完成了,它应该结束并忽略其余时间间隔。

rsp*_*rsp 8

与这里的一些评论相反,这是一个奇怪的要求,即在进程运行时定期执行某些操作而不使进程无限运行,这将使其变得毫无意义。

有一个内置的机制。如果您不希望间隔(或超时)停止进程退出,则需要使用该.unref()方法。

代替:

setInterval(() => {
  console.log('Interval');
}, 1000);
Run Code Online (Sandbox Code Playgroud)

使用:

setInterval(() => {
  console.log('Interval');
}, 1000).unref();
Run Code Online (Sandbox Code Playgroud)

如果没有其他待处理事件,您的时间间隔将不会停止该过程的退出。

尝试运行以下示例:

setInterval(() => {
  console.log('Interval');
}, 1000).unref();

setTimeout(() => {
  console.log('Timeout 1');
}, 3000);

setTimeout(() => {
  console.log('Timeout 2');
}, 5000);
Run Code Online (Sandbox Code Playgroud)

参见文档: