NodeJS setInterval计时器在第一个间隔后崩溃
NodeJS setInterval timer crashing after first interval
我试图每小时执行一个函数。这实际上是对来自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()(我假设函数调用不返回函数)。
相关文章:
- 而循环只设置php中输入字段中的第一个值
- 错误:$injector:modulerr模块错误(我的第一个SPA应用程序)
- IE11中的第二个调用取消了第一个Fetch API调用
- Javascript XMLHttpRequest——只有第一个POST请求有效
- 使用javascript或angularjs特定过滤器搜索字符串中第一个img标记的json值
- 将OnClick函数设置为<ul>,最后一个ul是擦除第一个ul-s
- RxJS油门行为;立即获取第一个值
- Angular UI网格:如何通过第一个UI网格中的按钮使第二个UI网格可见
- 选择多个实例中的第一个
- 如何在调用下一个请求之前完成第一个Ajax Get请求
- Lodash:返回对象的第一个键,该对象的值(即数组)中有一个给定的元素(即字符串)
- 看起来第一个console.log是'It’不太对
- 与杜兰达尔合作的第一个JavaScript项目.尝试从第三方 API 获取数据
- 节点发布错误对象的第一个“属性”
- Javascript:表单验证getElementById仅返回第一个id元素
- 仅将 CSS 规则应用于
中的第一个 ,而不分配类/ID - JS在隐藏未定义的值后仅从数组中返回第一个id的值
- 高图表,检测点是否在堆栈中的第一个
- json结果显示第一个值
- 我的设备后退按钮工作不正常,它转到第一个html,但返回到第二个html