2016-03-03 78 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

謝謝你解釋!這是有道理的,它按預期工作:)。 –

相關問題