@raft88

Как выполнить массив промисов с передачей по цепочке результата?

Всем привет!
есть массив arr промисов, каждый обернут в функцию
каждый имеет вид (упрощенно)
function(result) {
    return new Promise((resolve)=>setTimeout(()=>resolve(result), 1000));
}


есть метод с кодом:
this.method = function () {
        let result = Promise.resolve(data);

        for (let func of this.arr) {
            result = result.then(func);
        }
    };

хотя сами промисы вызываются последовательно с нужной задержкой,
но данные, назовем data, никто дальше по цепочке не видит, как исправить?
  • Вопрос задан
  • 181 просмотр
Решения вопроса 1
rockon404
@rockon404
Frontend Developer
Так:
this.method = function () {  
  return this.arr.reduce((acc, fn) => acc.then(fn), Promise.resolve());
}

Функция вернет результат выполнения цепочного вызова.
Демо: https://jsfiddle.net/t7199xrr/

UPD ваш вариант тоже отлично работает.
Видимо, у вас изначально проблема была в аргументах setTimeout.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
alex_keysi
@alex_keysi
frontend developer
есть хорошая функция для промисов, называется waterfall
вот ссылочка waterfallJS
я тебе уже сделал якорь где показано.
там все легко, написано нужно по завершению вызвать callback и передать в него первую это ошибка, а все остальные это параметры которые будут передаваться по цепочке
Ответ написан
@profesor08
Используй async, await и твой асинхронный код примет линейный вид и выполнится линейно. И не надо выдумывать всякую хрень с задержками.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы