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

Javascript 当每个函数返回deferred.promise时,如何链接函数数组的执行?,javascript,node.js,deferred,Javascript,Node.js,Deferred,我在Node.js中使用deferred模块创建了我的第一个deferred对象,当我将结果传递给下一个函数并触发resolve和reject时,它工作得非常好。当每个函数返回deferred.promise时,如何链接函数数组的执行? 我喜欢函数的输入参数数组和第一个函数的输入参数,每个下一个函数都从上一个函数得到参数 它的工作原理类似于f1(100)。然后(f2)。然后(f3),但是当我有n个函数时,它是如何工作的。您需要在循环中构建承诺链: var promise = funcs[0](i

我在Node.js中使用deferred模块创建了我的第一个deferred对象,当我将结果传递给下一个函数并触发resolve和reject时,它工作得非常好。当每个函数返回deferred.promise时,如何链接函数数组的执行? 我喜欢函数的输入参数数组和第一个函数的输入参数,每个下一个函数都从上一个函数得到参数


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

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

var promise = funcs[0](input);
for (var i = 1; i < funcs.length; i++)
    promise = promise.then(funcs[i]);
var promise=funcs[0](输入);
对于(变量i=1;i
相同的想法,但您可能会发现它更经典或更紧凑:

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

如果您没有想要使用的特定的
开始\u promise
,只需使用
promise.resolve()

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

对于可能为空的
funcs
数组:

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

ES6,考虑其他参数:

function chain(callbacks, initial, ...extraArgs) {
 return callbacks.reduce((prev, next) => {
   return prev.then((value) => next(value, ...extraArgs));
 }, Promise.resolve(initial));
}
2017年的ES7方式

这将按顺序(逐个)执行给定的函数,而不是并行执行。
参数
Promise
是一组函数(不是
Promise
s),返回
Promise

是的,这就是我所说的“通过赋值链接”——不是一个正式术语,但希望有意义。如何在解决最后一个承诺后调用回调?@saraf:call
。然后(),和其他承诺一样,使用for语句遍历数组不如使用reduce技术。但这是有效的@波帕拉:我花了一个小时的时间试图通过减量来做同样的事情。我仍然找不到一种方法来表达它使用减少。。。如果有人用reduce来表达SLAks所做的事情,我会很感激,但在此之前我必须坚持这种方法。完全只是用Google逐字逐句地搜索你的问题。这个解决方案从根本上说比@SLAks的解决方案更强,因为闭包能够引用当前正在执行的回调。如果您想在链中“做额外的异步工作”,则
funcs[i]
不会帮助您,但
cur
会帮助您。@Kumagoro the
prev.then(cur)
是正确的,因为请记住,
cur
是一个返回承诺的函数。使用此技术减少承诺链是思考代码将要发生什么的一种非常平滑的方式。
  async function runPromisesInSequence(promises) {
    for (let promise of promises) {
      console.log(await promise());
    }
  }