无法使用Node-Cron在module.exports对象中执行回调?

时间:2016-03-03 02:00:30

标签: javascript node.js cron

所以我每天晚上都使用一个名为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执行它。

有什么想法吗?

1 个答案:

答案 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');