所以我每天晚上都使用一个名为node-cron的模块来执行一系列功能。
我的功能位于另一个文件中。我在我的app.js中添加了required
该文件,其中node-cron对象所在的位置。该对象看起来像这样
var job = new CronJob('00 51 17 * * 0-6', savantJS.getTracksFromSavants, null, true, 'America/Los_Angeles');
这将在LA时间下午5:51执行我的savantJS文件中的getTracksFromSavants
函数就好了。但是当我尝试在savantJS文件中使用回调函数时会出现问题。
例如:
module.exports = {
getTracksFromSavants: function(){
//do stuff here with arr
if(stuff happens here){
this.doNextFunction(arr)
}
},
doNextFunction: function(arr){
//do stuff
}
}
这会很好地执行getTracksFromSavants
函数,但一旦到达if
,就会说doNextFunction
未定义。
另一方面,如果我像这样写我的Cron:
var job = new CronJob('00 51 17 * * 0-6', savantJS.getTracksFromSavants(), null, true, 'America/Los_Angeles');
它在getTracksFromSavants()
中执行回调。但问题是,当我在CronJob对象中使用()
时,它会在每次启动服务器时执行该函数,而它应该只在下午5:51执行它。
有什么想法吗?
答案 0 :(得分:1)
var obj = {
f: function() {
return this;
}
}
obj.f() // returns obj
var ff = obj.f;
ff(); // does not return obj - `ff` does not know the function came from `f`.
ff = ff.bind(obj);
ff(); // returns obj again
在JavaScript中,使用点表示法调用方法将设置this
。调用没有点的方法不会。将savantJS.getTracksFromSavants
传递给函数时,它会成为某个参数;当调用该参数时,它不知道它与savantJS
有任何连接。除非你将接收器绑定到它。
因此,您希望将方法调用包装在普通函数中(不依赖于作为方法调用):
var job = new CronJob('00 51 17 * * 0-6', function() {
savantJS.getTracksFromSavants();
}, null, true, 'America/Los_Angeles');
或者你可以将函数绑定到接收器(它基本上做同样的事情):
var job = new CronJob('00 51 17 * * 0-6',
savantJS.getTracksFromSavants.bind(savantJS),
null, true, 'America/Los_Angeles');