2014-01-25 113 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

相关问题