我使用延迟模块在Node.js中创建了我的第一个延迟对象,当我将结果传递给下一个函数并触发解析并拒绝时,它工作得很好。当每个函数返回deferred.promise时,如何链接函数数组的执行?我喜欢第一个函数的输入参数数组和输入参数,以及前一个函数的每个下一个函数get参数。
它像f1(100).then(f2).then(f3)
一样工作,但是当我有多个函数时如何。
您需要在循环中构建一个promise链:
var promise = funcs[0](input);
for (var i = 1; i < funcs.length; i++)
promise = promise.then(funcs[i]);
同样的想法,但你可能会发现它稍微更优雅或更紧凑:
funcs.reduce((prev, cur) => prev.then(cur), starting_promise);
如果您没有想要使用的特定starting_promise
,请使用Promise.resolve()
。
在@torazaburo的基础上,我们还可以添加一条“不快乐的道路”
funcs.reduce(function(prev, cur) {
return prev.then(cur).catch(cur().reject);
}, starting_promise);
ES6,允许其他参数:
function chain(callbacks, initial, ...extraArgs) {
return callbacks.reduce((prev, next) => {
return prev.then((value) => next(value, ...extraArgs));
}, Promise.resolve(initial));
}
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
。
对于可能的空funcs
数组:
var promise = $.promise(function(done) { done(); });
funcs.forEach(function(func) {
promise = promise.then(func);
});