无法在模块中执行回调,使用 Node-Cron导出对象

Not able to execute callbacks in module.exports object using Node-Cron?

本文关键字:Node-Cron 使用 对象 回调 模块 执行      更新时间:2023-09-26

所以我每天晚上使用一个名为node-cron的模块来执行一系列函数。

我的函数位于另一个文件中。 我已经在我的应用程序中添加了该文件required.js节点 cron 对象所在的位置。 该对象如下所示

var job = new CronJob('00 51 17 * * 0-6', savantJS.getTracksFromSavants, null, true, 'America/Los_Angeles');

这将在洛杉矶时间下午 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 执行它。

有什么想法吗?

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