> Как использовать асинхронные функции при переборе элементов, например в reduce (JavaScript)

Уровень: senior · Роль: frontend · Язык: JavaScript · Категория: Технические вопросы

Компании: TrendTech

Стек: Node.js, JavaScript

> Пример ответа

При работе с асинхронными функциями в reduce нужно помнить, что сам reduce не поддерживает async/await напрямую - коллбэк должен возвращать аккумулятор, а не Promise. Правильный подход - использовать reduce с аккумулятором-промисом, последовательно разрешая каждый шаг.

Пример: допустим, нужно получить данные по каждому ID из массива и накопить результат.

JAVASCRIPT
const ids = [1, 2, 3];
async function fetchData(id) {
// имитация асинхронного запроса
return new Promise(resolve => setTimeout(() => resolve({ id, data: `data-${id}` }), 100));
}
// Последовательное выполнение (каждый следующий ждёт предыдущий)
const results = await ids.reduce(async (accPromise, id) => {
const acc = await accPromise; // ждём предыдущий аккумулятор
const data = await fetchData(id);
acc.push(data);
return acc;
}, Promise.resolve([]));
console.log(results); // [{ id: 1, data: 'data-1' }, ...]

Важно: начальное значение аккумулятора должно быть промисом (Promise.resolve([])), а сам коллбэк - асинхронным. Если нужно параллельное выполнение (все запросы одновременно), лучше использовать Promise.all с map, а не reduce:

JAVASCRIPT
const results = await Promise.all(ids.map(fetchData));

Выбор зависит от задачи: последовательная обработка (например, с зависимостью от предыдущего результата) - reduce с промисами, независимые операции - Promise.all.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью