当每个函数返回deferred.promise时,如何链接函数数组的执行?

问题描述 投票:34回答:6

我使用延迟模块在Node.js中创建了我的第一个延迟对象,当我将结果传递给下一个函数并触发解析并拒绝时,它工作得很好。当每个函数返回deferred.promise时,如何链接函数数组的执行?我喜欢第一个函数的输入参数数组和输入参数,以及前一个函数的每个下一个函数get参数。

它像f1(100).then(f2).then(f3)一样工作,但是当我有多个函数时如何。

javascript node.js deferred
6个回答
43
投票

您需要在循环中构建一个promise链:

var promise = funcs[0](input);
for (var i = 1; i < funcs.length; i++)
    promise = promise.then(funcs[i]);

74
投票

同样的想法,但你可能会发现它稍微更优雅或更紧凑:

funcs.reduce((prev, cur) => prev.then(cur), starting_promise);

如果您没有想要使用的特定starting_promise,请使用Promise.resolve()


6
投票

在@torazaburo的基础上,我们还可以添加一条“不快乐的道路”

funcs.reduce(function(prev, cur) {
  return prev.then(cur).catch(cur().reject);
}, starting_promise); 

5
投票

ES6,允许其他参数:

function chain(callbacks, initial, ...extraArgs) {
 return callbacks.reduce((prev, next) => {
   return prev.then((value) => next(value, ...extraArgs));
 }, Promise.resolve(initial));
}

3
投票

2017年的ES7方式.http://plnkr.co/edit/UP0rhD?p=preview

  async function runPromisesInSequence(promises) {
    for (let promise of promises) {
      console.log(await promise());
    }
  }

这将按顺序(逐个)执行给定的功能,而不是并行执行。参数promises是函数的集合(NOT Promises),它返回Promise


0
投票

对于可能的空funcs数组:

var promise =  $.promise(function(done) { done(); });
funcs.forEach(function(func) {
  promise = promise.then(func);         
});
© www.soinside.com 2019 - 2024. All rights reserved.