【问题标题】:When can I use lodash.after()?什么时候可以使用 lodash.after()?
【发布时间】:2014-01-25 13:29:12
【问题描述】:

我是函数式编程的新手,有人推荐 lodash 了解主要的高阶函数。

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

【问题讨论】:

    标签: javascript functional-programming lodash


    【解决方案1】:

    _.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 字段)异步执行保存操作,并在完成保存操作后调用回调(@987654335 @ 传递给它的对象中的字段)恰好一次。

    所以_forEach 循环在saves 中对每个项目调用一次asyncSave,这意味着saves 中的每个项目都会启动一个保存操作。由于doneasyncSave 的回调,最终done 将被调用,每次保存操作一次。因为done 是用_.after 创建的,并且传递给_.after 的计数等于saves.length,所以传递给_.after 的匿名函数在done 被调用saves.length 次之前不会实际执行。换句话说,在示例中启动的所有保存操作都完成之前,它不会被调用。

    【讨论】:

    • 感谢您的详细解释。您的示例比 lodash API 文档的示例更易于理解。
    猜你喜欢
    • 2011-02-24
    • 2012-07-09
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    相关资源
    最近更新 更多