2014-01-25 149 views
4

我是功能編程的新手,有人建議lodash瞭解主要的高階函數。什麼時候可以使用lodash.after()?

瀏覽lodash API文檔,我把握不住sample code_.after()

var saves = ['profile', 'settings']; 

var done = _.after(saves.length, function() { 
    console.log('Done saving!'); 
}); 

_.forEach(saves, function(type) { 
    asyncSave({ 'type': type, 'complete': done }); 
}); 
// → logs 'Done saving!', after all saves have completed 

上面的示例代碼沒有實行asyncSave(),所以我應該實現的功能爲自己。但我不知道如何實現它。這是因爲我不明白_.after()本身的規格。

如果有人比API文檔更容易解釋函數,那將會很棒。或者一個易於理解和實用的功能示例將是一個很大的幫助。謝謝!

回答

7

_.after以計數n和函數f爲參數,它返回一個新函數,我們可以將其稱爲fp(對於「f prime」)。函數fp是這樣的,它保持了它被調用了多少次的計數。只要調用次數爲fp的次數小於n,調用fp就不會執行任何操作(除了保持調用次數以外)。一旦調用的次數爲fp等於或大於n,則調用f

所以:

var _ = require("lodash"); 
var fp = _.after(3, function() { console.log("OMG!"); }); 
fp(); // Nothing 
fp(); // Nothing 
fp(); // Prints "OMG!" 

功能asyncSave會是這樣執行一個異步的(傳遞給它的對象type場)給定類型數據的保存操作,並在完成保存操作調用一個回調(傳遞給它的對象中的complete字段)只有一次。

因此,_forEach循環在saves中的每個項目調用asyncSave一次,這意味着在saves中的每個項目啓動一個保存操作。由於doneasyncSave的回調,因此每次保存操作最終會調用done。因爲done是用_.after創建的,並且傳遞給_.after的計數等於saves.length,所以傳遞給_.after的匿名函數將不會實際執行,直到done被稱爲saves.length次。換句話說,在示例中啓動的所有保存操作完成之前,它不會被調用。

+0

感謝您的詳細解釋。你的例子比lodash API doc的例子更好理解。 – philipjkim

相關問題