我是函数式编程的新手,有人建议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文档所说的更容易解释函数,那就太棒了。或者,一个易于理解和实用的功能示例将是一个很大的帮助。谢谢!
答案 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
中的每个项目都会启动一个保存操作。由于done
是asyncSave
的回调,因此每次保存操作最终会调用done
。由于done
是使用_.after
创建的,并且传递给_.after
的计数等于saves.length
,因此传递给_.after
的匿名函数实际上不会执行{ {1}}被称为done
次。换句话说,在示例中启动的所有保存操作完成之前,不会调用它。