Задать вопрос
@jeruthadam
Я крут

Как сделать таймаут в цикле?

Есть асинхронная функция (которая качает картинку), есть массив данных с ссылками. Надо последовательно выполнять запросы (не одновременно) и делать таймаут между ними.

Для прохода по массиву использую for...of. Но как сделать таймаут между вызовами функции? Внутри цикла не работает setTimeout (все выполняется наоборот одновременно)

for (const item of array) {
  await processImage(image, name)
}
  • Вопрос задан
  • 108 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Внутри цикла не работает setTimeout

Заворачиваем setTimeout в промис:

const wait = time => new Promise(r => setTimeout(r, time));

И тогда его можно будет await'ить в цикле:

(async () => {
  for (const n of [ 1, 2, 3, 4, 5 ]) {
    console.log(n);
    await wait(1000);
  }
})();

Можно и без await'а, если отказаться от цикла и сделать цепочку promise'ов:

[ 1, 2, 3, 4, 5 ].reduce((promise, n) => promise
  .then(() => console.log(n))
  .then(() => wait(1000))
, Promise.resolve());
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы