我已经使用 deferred module在 Node.js 中创建了我的第一个延迟对象,当我将结果传递给下一个函数并触发解析和拒绝时,它工作得很好。当每个函数返回 deferred.promise 时,如何链接函数数组的执行?我喜欢函数的输入参数数组和第一个函数的输入参数,每个下一个函数都从前一个函数获取参数。
它的工作原理类似于f1(100).then(f2).then(f3)
,但是当我有 n 个函数时如何。
我已经使用 deferred module在 Node.js 中创建了我的第一个延迟对象,当我将结果传递给下一个函数并触发解析和拒绝时,它工作得很好。当每个函数返回 deferred.promise 时,如何链接函数数组的执行?我喜欢函数的输入参数数组和第一个函数的输入参数,每个下一个函数都从前一个函数获取参数。
它的工作原理类似于f1(100).then(f2).then(f3)
,但是当我有 n 个函数时如何。
同样的想法,但您可能会发现它更优雅或更紧凑:
funcs.reduce((prev, cur) => prev.then(cur), starting_promise);
如果您没有starting_promise
要使用的特定内容,请使用Promise.resolve()
.
您需要在循环中构建一个Promise链:
var promise = funcs[0](input);
for (var i = 1; i < funcs.length; i++)
promise = promise.then(funcs[i]);
在@torazaburo 的基础上,我们还可以添加“不愉快的路径”
funcs.reduce(function(prev, cur) {
return prev.then(cur).catch(cur().reject);
}, starting_promise);
2017 年的 ES7 方式。http://plnkr.co/edit/UP0rhD? p= preview
async function runPromisesInSequence(promises) {
for (let promise of promises) {
console.log(await promise());
}
}
这将按顺序(一个接一个)执行给定的函数,而不是并行执行。参数promises
是函数的集合(NOT Promise
s),它返回Promise
.
ES6,允许额外的参数:
function chain(callbacks, initial, ...extraArgs) {
return callbacks.reduce((prev, next) => {
return prev.then((value) => next(value, ...extraArgs));
}, Promise.resolve(initial));
}