Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript NodeJs setInterval不延长进程生命周期_Javascript_Node.js_Asynchronous_Settimeout_Setinterval - Fatal编程技术网

Javascript NodeJs setInterval不延长进程生命周期

Javascript NodeJs setInterval不延长进程生命周期,javascript,node.js,asynchronous,settimeout,setinterval,Javascript,Node.js,Asynchronous,Settimeout,Setinterval,为了更好地理解我的需求,我简化了它:我必须做的任务是,我们有一个长的未知nodejs进程(有许多排队的异步函数,我们永远不知道它们何时完成或类似的事情),我们想要有一个更新进程,我们将当前进程状态存储在数据库中。为此,我们有一个启动(它存储“start”)和一个结束进程,该进程位于process.on('beforexit',function(){…})之上。现在我们必须处理客户要求的“仍在运行”流程。为此,我们希望每十分钟更新一次状态,以使用时间戳运行(此函数已存在,名为state.setRu

为了更好地理解我的需求,我简化了它:我必须做的任务是,我们有一个长的未知nodejs进程(有许多排队的异步函数,我们永远不知道它们何时完成或类似的事情),我们想要有一个更新进程,我们将当前进程状态存储在数据库中。为此,我们有一个启动(它存储“start”)和一个结束进程,该进程位于
process.on('beforexit',function(){…})之上。现在我们必须处理客户要求的“仍在运行”流程。为此,我们希望每十分钟更新一次状态,以使用时间戳运行(此函数已存在,名为
state.setRunningState()

现在我有一个问题:如何每十分钟触发一次该函数。为此,我采用了在工作流程的每个事件上触发该函数的方法,并比较它是否比10分钟前更旧。问题是:有时没有任何事件的时间要长得多。所以第二个选项是
setInterval()
我的问题是:如果我使用setInterval,我的nodejs进程将永远不会结束,因此进程将无休止地运行,直到清除Interval。但我也不知道什么时候应该调用
clearInterval()


所以问题是:有没有一种方法可以在不延长nodejs进程生命周期的情况下创建这样一个超时。如果所有操作都完成了,那么它应该结束并忽略剩余的时间间隔。

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

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

而不是:

setInterval(() => {
  console.log('Interval');
}, 1000);
使用:

如果没有其他未决事件,您的间隔将不会停止进程退出

尝试运行以下示例:

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

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

setTimeout(() => {
  console.log('Timeout 2');
}, 5000);
见文件:


    • 让我看看我是否明白了这一点。 1-您希望每x分钟触发一次事件,除非现有进程已结束? 2-您说只要存在运行集间隔,节点就不会退出进程。 3-您说,由于您的进程运行“许多排队异步函数”,因此您无法知道进程何时结束

      我认为最简单的解决方案是设置另一个间隔以更高的频率运行,并在所有函数都返回时清除该间隔,否则您可能会对阅读webworkers感兴趣


      FYI您可以通过
      process.exit()
      退出流程,我知道这一点,但这里没有答案,因为:我仍然不知道主流程何时结束。它是完全异步的,只有事件驱动的。顺便说一句:process.exit()也跳过事件流程。on(“beforexit”)这个问题我已经读了三遍了,但我还是不明白你在问什么……”“有没有办法在不延长nodejs进程生命周期的情况下创建这样一个超时?”再次强调:我必须在时间间隔一侧解决它。setTimeout不会改变这一点,因为它必须递归使用。问题在于setTimeout的行为。这意味着我需要一个替代节点的基本超时处理的方法“我必须在时间间隔一侧解决它。”。unref()将是一个更好的选择,正如公认的答案所建议的那样
      setInterval(() => {
        console.log('Interval');
      }, 1000).unref();
      
      setTimeout(() => {
        console.log('Timeout 1');
      }, 3000);
      
      setTimeout(() => {
        console.log('Timeout 2');
      }, 5000);