NodeJS setInterval计时器在第一个间隔后崩溃

NodeJS setInterval timer crashing after first interval

本文关键字:崩溃 第一个 setInterval 计时器 NodeJS      更新时间:2023-09-26

我试图每小时执行一个函数。这实际上是对来自MonoDB的文档进行验证。但是,在第一个时间间隔时,应用程序崩溃并抛出以下错误:

timers.js:252  
 callback.apply(this, args);  
          ^  
TypeError: Cannot call method 'apply' of undefined  
    at wrapper [as _onTimeout] (timers.js:252:14)
    at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)  

以下是我的文件片段:

验证器

function validate() { ... }
module.exports = {
  validate : validate
}

www

var validator = require('../lib/validator');
var app = require('../app');
app.listen(3000, function() {
  setInterval(validator.validate(), 360000);
}

setInterval()接受一个方法引用。您只需要从传入回调函数的地方删除括号:

setInterval(validator.validate, 360000);

本质上,第二次触发interval时,它将尝试调用第一次调用validate()的结果,而不是函数本身,从而产生错误。下面是客户端JavaScript中的类似测试(setInterval的行为方式与我所知相同):

function setTime() {
  $('#currentDateTime').html(new Date());
}
$(function() {
  setInterval(setTime, 1000);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="currentDateTime"></div>

作为一个有趣的,以防这个答案,我发现另一个用户似乎正确地传递了方法引用,但得到了类似的错误。注释假设可能会有一个超时的上限(int的大小?符号整数吗?只是猜测)。

在setinterval

中使用长间隔时Node.js崩溃

你没有正确调用setInterval…它应该被包装在自己的函数作用域中。

app.listen(3000, function() {
  setInterval(function() { validator.validate() }, 360000);
}

试试下面的代码片段。

app.listen(3000, function() {
  setInterval(validator.validate.bind(validator), 360000);
}

setInterval接受一个函数作为第一个参数,您的代码片段立即调用validator.validate()(我假设函数调用不返回函数)。