我什么时候可以使用lodash.after()?

时间:2014-01-25 13:29:13

标签: javascript functional-programming lodash

我是函数式编程的新手,有人建议lodash来理解主要的高阶函数。

浏览lodash API文档,我无法掌握_.after()的{​​{3}}:

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文档所说的更容易解释函数,那就太棒了。或者,一个易于理解和实用的功能示例将是一个很大的帮助。谢谢!

1 个答案:

答案 0 :(得分:10)

_.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循环在asyncSave中的每个项目调用saves一次,这意味着saves中的每个项目都会启动一个保存操作。由于doneasyncSave的回调,因此每次保存操作最终会调用done。由于done是使用_.after创建的,并且传递给_.after的计数等于saves.length,因此传递给_.after的匿名函数实际上不会执行{ {1}}被称为done次。换句话说,在示例中启动的所有保存操作完成之前,不会调用它。