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

时间:2014-01-27 03:00:21

标签: javascript node.js deferred

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

它的工作方式与f1(100).then(f2).then(f3)类似,但是如果我有多个函数的话。

6 个答案:

答案 0 :(得分:74)

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

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

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

答案 1 :(得分:43)

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

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

答案 2 :(得分:6)

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

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

答案 3 :(得分:5)

ES6,允许其他参数:

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

答案 4 :(得分: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 Promise s),返回Promise

答案 5 :(得分:0)

对于可能的空funcs数组:

var promise =  $.promise(function(done) { done(); });
funcs.forEach(function(func) {
  promise = promise.then(func);         
});