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

IT技术 javascript node.js deferred
2021-02-20 08:30:00

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

它的工作原理类似于f1(100).then(f2).then(f3),但是当我有 n 个函数时如何。

6个回答

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

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

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

这个解决方案从根本上比@SLaks 的解决方案更强大,因为闭包能够引用当前正在执行的回调。如果您想在链中“做额外的异步事情”,funcs[i]这不会帮助您,但cur帮助您
2021-04-26 08:30:00
@Kumagoroprev.then(cur)是正确的,因为记住cur是一个返回Promise的函数。
2021-05-05 08:30:00

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

var promise = funcs[0](input);
for (var i = 1; i < funcs.length; i++)
    promise = promise.then(funcs[i]);
解决最后一个Promise后如何调用回调?
2021-04-18 08:30:00
使用 for 语句遍历数组不如使用归约技术那么优雅。但是有效!
2021-04-22 08:30:00
@saraf:调用.then()它,就像任何其他Promise一样。
2021-05-09 08:30:00
@Popara 我只是花了一个小时试图通过减少来做同样的事情。而且我仍然无法找到一种使用归约来表达它的方法......如果有人使用归约来表达 SLAks 所做的事情,我会很感激,但在那之前我将不得不坚持这种方法。
2021-05-12 08:30:00
是的,这就是我所说的“按分配链接”——不是官方术语,但希望有意义。
2021-05-13 08:30:00

在@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 Promises),它返回Promise.

ES6,允许额外的参数:

function chain(callbacks, initial, ...extraArgs) {
 return callbacks.reduce((prev, next) => {
   return prev.then((value) => next(value, ...extraArgs));
 }, Promise.resolve(initial));
}
使用这种技术减少Promise链是考虑代码将要发生的事情的一种非常流畅的方式。
2021-04-21 08:30:00