javascript - 异步运行 lodash flow 时传递参数

标签 javascript functional-programming lodash currying function-composition

根据下面的代码,如何将 id 传递给 applySaveAsync 函数?

   var then = _.curry(function (f, thenable) {
        return thenable.then(f);
    });

    var validateAsync = _.flow(
        function () { return _(someCondition).showError(ERROR_01).value(); },  
        then(function () { return _(anotherCondition).showError(ERROR_02).value(); }) 
    );

    var save = _.flow(
        validateAsync,
        then(applySaveAsync),
        then(saveCompleted)
    );

    function applySaveAsync(id) {
        // Saving...
    }

    save(22); // Calling save function with some id.

我可以在 validateAsync 函数上获取 id,但无法将其返回,因为 validateAsync 应该返回一个 promise 。

有什么办法可以实现这一点吗?

最佳答案

最简单的选择是不使用 _.flow 来定义 validateAsync
由于 validateAsync 不接受参数,也没有结果,因此您只需更改 save 的定义以不使用 _.flow:

function save(id) {
    return validateAsync()
    .then(function(){ return applySaveAsync(id) })
    .then(saveCompleted)
}

我们还可以更改 validateAsync 以传递 id:

function validateAsync(id) {
    return _(someCondition).showError(ERROR_01).value()  
    .then(function () { return _(anotherCondition).showError(ERROR_02).value(); })
    .then(_.constant(id));
}

甚至在仍然使用_.flow的情况下做到这一点

var validateAsync = _.flow(
    function(id) { return _(someCondition).showError(ERROR_01).value().then(_.constant(id)); },  
    then(function(id) { return _(anotherCondition).showError(ERROR_02).value().then(_.constant(id)); }) 
);

但我建议不要这样做,因为 validateAsync 不应该是一个接受参数的函数。

让我们为此编写一个包装函数,以便我们以函数式方式进行传递:

function pass(fn) {
    return function(id) {
        return fn().then(function() {
            return id;
        });
    }
}

(如果您愿意,您可以尝试使用 then_.constant 等组合而成)
这样就可以写

var save = _.flow(
    wrap(validateAsync),
    then(applySaveAsync),
    then(saveCompleted)
);

关于javascript - 异步运行 lodash flow 时传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39803376/

相关文章:

scala - ZIO:如何加入 Fibers 以实现永久运行的流程

java - validateOrThrow 实现

functional-programming - 对于纯粹的、函数式的、热切评估的语言,垃圾收集器可以安全地做出哪些假设?

javascript - 如何正确使用 CSSStyleSheet.insertRule()?

javascript - lib 真正给 javascript 带来了哪些特性?

javascript - Lodash key与数组具有相同的属性

javascript - lodash 将对象数组转换为单个键数组和多个值数组

javascript - 深度替换知道我们必须在其中注入(inject)值的对象中的属性值的值

javascript - 冲突的@Dragenter @Dragleave/v-show 事件持续快速触发

javascript - 在不监听事件的情况下检查鼠标按钮是否按下?