Col*_*ber 1 javascript asynchronous settimeout setinterval node.js
我简化了它以更好地了解我的需要:我要做的任务是,我们有一个漫长的未知的nodejs进程(有很多排队的异步函数,我们不知道它们何时完成或类似的工作),并且想要有一个更新过程,我们将当前过程状态存储在数据库中。为此,我们有一个启动(它存储“开始”),一个结束过程位于之上process.on('beforeExit', function () { ... });。现在,我们必须处理客户要求的“仍在运行”过程。为此,我们想每十分钟更新一次带有时间戳的运行状态(此函数已经存在,并且称为state.setRunningState()
现在我有一个问题,我如何每十分钟触发一次该功能。为此,我打算在工作过程的每个事件上触发此函数,并比较它是否早于10分钟。问题是:有时会有更多的时间没有任何事件。所以第二个选择是setInterval(),这就是我的问题:如果我使用setInterval,我的nodejs进程将永远不会结束,因此该进程将无限运行直到清除Interval。但我也不知道该何时打电话clearInterval()
所以问题是:有没有一种方法可以创建这样的超时而不延长nodejs进程的生存时间。如果一切都完成了,它应该结束并忽略其余时间间隔。
与这里的一些评论相反,这是一个奇怪的要求,即在进程运行时定期执行某些操作而不使进程无限运行,这将使其变得毫无意义。
有一个内置的机制。如果您不希望间隔(或超时)停止进程退出,则需要使用该.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)
参见文档:
| 归档时间: |
|
| 查看次数: |
1383 次 |
| 最近记录: |