Ответ 1
Вам нужно построить цепочку обещаний в цикле:
var promise = funcs[0](input);
for (var i = 1; i < funcs.length; i++)
promise = promise.then(funcs[i]);
Я создал свой первый отложенный объект в Node.js с использованием отложенного модуля, и он отлично работает, когда я передаю результат следующей функции и запускаю разрешать и отклонять. Как связать выполнение массива функций, когда каждая функция возвращает отложенные. обещание? У меня есть набор параметров входных параметров и входной параметр для первой функции, и каждая следующая функция получает параметр из предыдущего.
Он работает как f1(100).then(f2).then(f3)
, но как у меня есть n количество функций.
Вам нужно построить цепочку обещаний в цикле:
var promise = funcs[0](input);
for (var i = 1; i < funcs.length; i++)
promise = promise.then(funcs[i]);
Такая же идея, но вы можете считать ее немного более классной или более компактной:
funcs.reduce((prev, cur) => prev.then(cur), starting_promise);
Если у вас нет специального starting_promise
, который вы хотите использовать, просто используйте Promise.resolve()
.
Основываясь на @torazaburo, мы также можем добавить "несчастливый путь"
funcs.reduce(function(prev, cur) {
return prev.then(cur).catch(cur().reject);
}, starting_promise);
ES6, допускающий дополнительные аргументы:
function chain(callbacks, initial, ...extraArgs) {
return callbacks.reduce((prev, next) => {
return prev.then((value) => next(value, ...extraArgs));
}, Promise.resolve(initial));
}
Для возможного пустого массива:
var promise = $.promise(function(done) { done(); });
funcs.forEach(function(func) {
promise = promise.then(func);
});
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
.