5

我是函数式编程的新手,有人建议我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

上面的示例代码没有实现asyncSave(),所以我应该自己实现这个功能。但我不知道如何实现它。这是因为我不了解其_.after()本身的规范。

如果有人比 API 文档说的更容易解释该功能,那就太好了。或者一个易于理解和实用的函数示例将是一个很大的帮助。谢谢!

4

1 回答 1

11

_.after将 countn和 function作为参数f,它返回一个我们可以调用的新函数fp(对于“f prime”)。该函数fp是这样的,它记录了它被调用的次数。只要fp被调用的次数小于n,调用fp什么也不做(除了保持被调用的次数)。一旦被调用的次数fp等于或大于nf被调用。

所以:

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之前不会真正执行。换句话说,在示例中启动的所有保存操作完成之前,它不会被调用。donesaves.length

于 2014-01-26T11:06:49.230 回答