Есть ли последовательный Promise.all?

Вот есть массив промисов:
var arr = ['a', 'b', 'c'];
var promises = arr.map(function(str) {
	return new Promise(function(resolve, reject) {
		console.log(str);
		setTimeout(resolve, 1000);
	});
});

Как выполнить этот массив последовательно (за 3 секунды)?
Есть ли общепринятый способ это делать?
Не верю, что каждый раз пишется велосипед или лезут в npm.

P.S. Это полнейшая глупость. При создании такого массива промисы уже выполнятся асинхронно.
  • Вопрос задан
  • 4023 просмотра
Решения вопроса 1
@dixoNich
frontend developer
Нет.
Можно сделать циклом, типа берём промис, выполняем его и в нём возвращаем следующий. Тогда будет цепочка. Насчёт 3-х секунд не понялс.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
let action = (i) => {
  return () => {
    return new Promise((resolve, reject) => {
      
      setTimeout(() => {
        document.write(i);
        resolve();
      }, 1000);
      
    });
  }
}

let p = Promise.resolve();

let a = [1, 2, 3, 4, 5];

for (let i of a) {
  p = p.then(action(i));
}


codepen.io/anon/pen/MaPzmy

Дополнение

Аккуратнее даже и полностью в функциональном стиле можно переписать с использованием reduce:

let a = [1, 2, 3, 4, 5];

a.reduce(
  (p, i) => p.then(
    () => new Promise(
      (resolve, reject) => {

        setTimeout(() => {
          console.log(i);
          resolve();
        }, 1000);

      }
    )
  ),
  Promise.resolve()
);
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы