@kr_ilya

Как асинхронно перебрать массив, с задержкой между итерациями?

Нужна async/await foreach функция с задержкой выполнения.
На данный момент есть такое решение, но оно работает не совсем правильно:

fn.asyncDelayedForEach = async (array, callback, timeout) => {
	var i = 0,
    l = array.length,
    caller = async () => {
      await callback.call(array, array[i], i, array);
      (++i < l) && setTimeout(caller, timeout);
    };
    caller();
}

(async () => {
	await fn.asyncDelayedForEach([1,3,4], (item, i, arr) => {
		console.log(item);
	}, 1000)

console.log('a')
console.log('b')
}
)()

Данный код возвращает

1
a
b
3
4

Причем задержка отрабатывает как надо, т.е. 1, 3, 4 возвращаются постепенно с интервалом 1 секунду, а вот

console.log('a')
console.log('b')

должны срабатывать только после завершения выполнения функции asyncDelayedForEach.
Т.е последовательность вывода должна быть такая:

1
3
4
a
b

Как исправить?
  • Вопрос задан
  • 90 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
const delay = timeout => new Promise(r => setTimeout(r, timeout));

async function asyncDelayedForEach(arr, callback, timeout) {
  for (let i = 0; i < arr.length; i++) {
    await callback.call(arr, arr[i], i, arr);
    await delay(timeout);
  }
}

// или

const asyncDelayedForEach = (arr, callback, timeout) =>
  arr.reduce((acc, n, i, a) => acc
    .then(() => callback.call(a, n, i, a))
    .then(() => delay(timeout))
  , Promise.resolve());
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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