phi*_*kim 4 javascript functional-programming lodash
我是函数式编程的新手,有人建议lodash理解主要的高阶函数.
浏览lodash API文档,我把握不住示例代码为_.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
Run Code Online (Sandbox Code Playgroud)
上面的示例代码没有实现asyncSave(),所以我应该为自己实现这个功能.但我不知道如何实现它.这是因为我不了解_.after()自己的规范.
如果有人解释函数比API文档说的更容易,那就太棒了.或者,一个易于理解和实用的功能示例将是一个很大的帮助.谢谢!
Lou*_*uis 10
_.after将count 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!"
Run Code Online (Sandbox Code Playgroud)
该函数asyncSave将对给定类型的数据(type传递给它的对象中的字段)异步执行保存操作,并且在完成保存操作时,只调用一次回调(complete传递给它的对象中的字段).
因此,每个项目_forEach循环调用asyncSave一次saves意味着每个项目启动一个保存操作saves.由于done是回调asyncSave,最终done会被调用,每一次保存操作.因为done创建了_.after并且传递的计数_.after等于saves.length,所以传递给的匿名函数在被调用次数_.after之前不会实际执行.换句话说,在示例中启动的所有保存操作完成之前,不会调用它.donesaves.length