2016-03-03 50 views
0

所以我使用一个叫做node-cron的模块来每天晚上执行一系列函数。无法使用Node-Cron在module.exports对象中执行回调?

我的功能位于另一个文件中。我在我的app.js中添加了required那个文件,其中node-cron Object所在的位置。该对象看起来像这样

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

这将在下午5点51分LA时间就好在我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 pm执行。

任何想法?

+0

你可以在调用'doNextFunction'之前检查'this'吗? –

+0

@TuanAnhTran'this'指的是module.exports对象......我想。我可以证实这一点,因为当我设置函数在cron中执行到'savantJS.getTracksFromSavants()'时,回调函数可以正常工作,因为回调函数'this.doNextFunction'可以正常工作。 –

回答

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

谢谢你解释!这是有道理的,它按预期工作:)。 –