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