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

时间:2015-07-17 02:51:36

标签: javascript node.js

我正在尝试每小时执行一次功能。这基本上验证了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);
}

3 个答案:

答案 0 :(得分:5)

setInterval()接受方法引用。您只需要从传递回调的位置删除括号:

setInterval(validator.validate, 360000);

基本上,第二次间隔触发它会尝试调用第一次调用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?signed int的大小?只是猜测)。

Node.js crashes when using long interval in setinterval

答案 1 :(得分:2)

您没有正确调用setInterval ...它应该包含在它自己的函数范围内。

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

答案 2 :(得分:1)

请尝试以下代码段。

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

setInterval将一个函数作为第一个参数,你的代码片段立即调用validator.validate()(我假设函数调用没有返回函数)。