Подтвердить что ты не робот

Как связать выполнение массива функций, когда каждая функция возвращает отложенную.

Я создал свой первый отложенный объект в Node.js с использованием отложенного модуля, и он отлично работает, когда я передаю результат следующей функции и запускаю разрешать и отклонять. Как связать выполнение массива функций, когда каждая функция возвращает отложенные. обещание? У меня есть набор параметров входных параметров и входной параметр для первой функции, и каждая следующая функция получает параметр из предыдущего.

Он работает как f1(100).then(f2).then(f3), но как у меня есть n количество функций.

4b9b3361

Ответ 1

Вам нужно построить цепочку обещаний в цикле:

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

Ответ 2

Такая же идея, но вы можете считать ее немного более классной или более компактной:

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

Если у вас нет специального starting_promise, который вы хотите использовать, просто используйте Promise.resolve().

Ответ 3

Основываясь на @torazaburo, мы также можем добавить "несчастливый путь"

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

Ответ 4

ES6, допускающий дополнительные аргументы:

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

Ответ 5

Для возможного пустого массива:

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

Ответ 6

ES7 путь в 2017. 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.