给定下面的代码,如何将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)
);

10-02 02:11