我试图每小时执行一个函数。这实际上是对来自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
你没有正确调用setInterval…它应该被包装在自己的函数作用域中。
app.listen(3000, function() {
setInterval(function() { validator.validate() }, 360000);
}
试试下面的代码片段。
app.listen(3000, function() {
setInterval(validator.validate.bind(validator), 360000);
}
setInterval接受一个函数作为第一个参数,您的代码片段立即调用validator.validate()(我假设函数调用不返回函数)。