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

Pao*_*aJ. 38 javascript node.js deferred

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

f1(100).then(f2).then(f3)有点像,但是当我有多个函数时.

小智 80

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

funcs.reduce((prev, cur) => prev.then(cur), starting_promise);
Run Code Online (Sandbox Code Playgroud)

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


SLa*_*aks 45

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

var promise = funcs[0](input);
for (var i = 1; i < funcs.length; i++)
    promise = promise.then(funcs[i]);
Run Code Online (Sandbox Code Playgroud)


Sim*_*n H 6

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

funcs.reduce(function(prev, cur) {
  return prev.then(cur).catch(cur().reject);
}, starting_promise); 
Run Code Online (Sandbox Code Playgroud)


all*_*kim 6

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

  async function runPromisesInSequence(promises) {
    for (let promise of promises) {
      console.log(await promise());
    }
  }
Run Code Online (Sandbox Code Playgroud)

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


jch*_*ook 5

ES6, allowing for additional arguments:

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