@fontvont

Как дождаться выполнения промиса в цикле?

Мне нужно вывести значения responses после цикла

(function loop(i) {
        if (i < urls.length) {
          request(urls[i]).then((response) => {
            responses.push(response);
            loop.call(null, i+1);
          });
        }
      })(0)

function request(url) {
  return new Promise((res, rej) => {
    const delayTime = Math.floor(Math.random() * 10000) + 1;
    setTimeout(() => res(url), delayTime);
  });
}
  • Вопрос задан
  • 1742 просмотра
Решения вопроса 1
Aetae
@Aetae Куратор тега JavaScript
Тлен
Современным подходом является await в цикле, но ничего не мешает сделать рекурсивную функцию, как во времена колбэков:
function loop(array, getPromise) {
  array = array.slice();
  const responses = [];
  return new Promise(function innerLoop(resolve, reject) {
    if (array.length) {
      return getPromise(array.shift()).then(response => {
        responses.push(response);
        innerLoop(resolve, reject);
      }, reject);
    } 
    resolve(responses);
  });
}

function request(url) {
  return new Promise((res, rej) => {
    const delayTime = Math.floor(Math.random() * 10000) + 1;
    setTimeout(() => res(url), delayTime);
  });
}

loop(['a', 'b'], request).then(console.log, console.error);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@kayart
  1. Использовать async
  2. Использовать for/for-of
  3. Использовать библиотеку вроде p-map
Ответ написан
Комментировать
Seasle
@Seasle Куратор тега JavaScript
Изучайте
const sleep = (duration = 0) => new Promise(resolve => setTimeout(resolve, duration));

(async function () {
  for (let index = 0; index < 10; index++) {
    console.log(Date.now());
    await sleep(1000);
  }
})();
Ответ написан
Комментировать
Tim-A-2020
@Tim-A-2020
let delay = (ms) => new Promise(resolve => {
  setTimeout(() => resolve(ms), ms)
})

let obj = [
  delay(1500),
  delay(2000),
  delay(5500)
]

for await (const promise of obj) {
  console.log(promise)
}
Ответ написан
Ваш ответ на вопрос

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

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