在 运行 lodash 异步流动时传递参数
Passing arguments while running lodash flow asynchronously
鉴于下面的代码,我如何将 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,但我不能 return 它回来,因为 validateAsync 应该 return 一个承诺。
有什么方法可以实现吗?
最简单的选择是不使用 _.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)
);
我发现这个包对你有用。在异步情况下,您可以使用 this package.
尽管 flow 是声明式编程的最佳实现之一,但它不支持现代 JS 编程风格。
import { Conductor } from '@puzzleio/conductor';
const conductor = Conductor.createDefault();
const myAsyncWorkflow = conductor
.add(validateAsync)
.if({
check: item => item.isValid === true,
handler: item => console.log('Item is valid')
},
{
// else block
handler: item => console.log('Validation failed')
});
myAsyncWorkflow.run(obj)
.then(() => console.log('Successfully validated'))
.catch(console.error);
鉴于下面的代码,我如何将 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,但我不能 return 它回来,因为 validateAsync 应该 return 一个承诺。
有什么方法可以实现吗?
最简单的选择是不使用 _.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)
);
我发现这个包对你有用。在异步情况下,您可以使用 this package.
尽管 flow 是声明式编程的最佳实现之一,但它不支持现代 JS 编程风格。
import { Conductor } from '@puzzleio/conductor';
const conductor = Conductor.createDefault();
const myAsyncWorkflow = conductor
.add(validateAsync)
.if({
check: item => item.isValid === true,
handler: item => console.log('Item is valid')
},
{
// else block
handler: item => console.log('Validation failed')
});
myAsyncWorkflow.run(obj)
.then(() => console.log('Successfully validated'))
.catch(console.error);