Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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
Node.js 如何在nodejs脚本中创建可靠的调度器?_Node.js_Loops_Events_Scheduler - Fatal编程技术网

Node.js 如何在nodejs脚本中创建可靠的调度器?

Node.js 如何在nodejs脚本中创建可靠的调度器?,node.js,loops,events,scheduler,Node.js,Loops,Events,Scheduler,我有一个基于Nodejs-Expressjs的服务,它还应该根据自定义计划更新内部的一些数据。时间表很简单,我不需要额外的图书馆来遵循它。它只是一个带有expiration DateTime值的数组,在循环中进行检查 实际的问题是使这个回路可靠。有时服务会出错(奇怪且非常罕见的错误,我无法捕捉到,但这并不重要),结果是计划循环被破坏,不再跟踪和处理任何事件 同时,Expressjs循环继续工作,因此pm2不会重新启动脚本 下面是我的计划程序现在的样子: async startoop() { 让自

我有一个基于Nodejs-Expressjs的服务,它还应该根据自定义计划更新内部的一些数据。时间表很简单,我不需要额外的图书馆来遵循它。它只是一个带有expiration DateTime值的数组,在循环中进行检查

实际的问题是使这个回路可靠。有时服务会出错(奇怪且非常罕见的错误,我无法捕捉到,但这并不重要),结果是计划循环被破坏,不再跟踪和处理任何事件

同时,Expressjs循环继续工作,因此pm2不会重新启动脚本

下面是我的计划程序现在的样子:

async startoop()
{
让自我=这个;
while(true){
让item_id=this.FindNewestExpired();
如果(项目编号){
等待此。重新验证块(项目id);
等待此消息。超时(1);
}否则{
log('还没有过期。请等待10秒…');
等待这个。超时(10000);
}
}
}
我是否需要使用任何npm库来实现自恢复调度程序,或者有一个神奇的nodejs指令来实现这一点

我有一个想法,将这个循环实现为一个独立的脚本,由pm2跟踪并在我的服务中调用特定的URL(Linux cron simulation),但我认为这有点开销


谢谢

对于初学者,在任何
await
语句上都没有显示错误处理。如果其中任何一个拒绝,您将得到未经处理的拒绝,您的
while()
循环将停止。要捕获
wait
中的错误,您应该用
try/catch
围绕一个或多个语句。然后,在node.js中编写基于计时器的代码有点奇怪。您基本上是轮询,然后检查过期时间。您只需找到下一个过期时间,然后使用
setTimeout()
设置该特定时间的通知。触发后,找到下一个过期时间,并为该时间设置一个新的
setTimeout()
。这将消耗更少的CPU,并将处理更接近其实际时间的过期。如果在任何时候,您添加了一个新的到期日,您只需检查它是否是最快到期的。如果是这样,请取消当前计时器并设置一个新的计时器。@jfriend00是的,感谢您对另一种方法的解释。在这个应用程序中,更新的现状并不是必需的,还有一件事:通常会出现另一个需要提前更新的项目。因此,这种方法看起来非常复杂(正如我所认为的那样),可靠性会降低。我将尝试按照您上面的建议,在这些等待电话周围放置try/catch,让我们看看几天后会发生什么!谢谢。如果您的算法是每10秒轮询一次并处理所有过期时间,那么您可以使用
setInterval()
设置10秒并只处理所有过期时间。@jfriend00也是一种很好的方法,但它不适合这种特殊情况。处理某些项目可能需要比10秒长得多的时间,我担心间隔计时器在尝试一次又一次地重新调用同一代码时可能会造成一些混乱。