> Как положить результат промиса в массив по индексу в JavaScript? (JavaScript)

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

Компании: РСХБ

Стек: JavaScript

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

Короткий ответ

Результат промиса можно положить в массив по индексу через then с присваиванием arr[index] = value, либо через async/await с прямым присваиванием. Важно учитывать, что промис асинхронный, поэтому массив должен существовать до выполнения колбэка. Для параллельного заполнения нескольких индексов используйте Promise.all, чтобы дождаться всех результатов.

Подробное объяснение

Промис - это асинхронная операция, результат которой становится доступен после вызова resolve или reject. Присваивание по индексу - обычная операция с массивом, но она должна выполняться внутри колбэка then или после await.

Ключевой момент: если вы присваиваете результат по индексу, массив уже должен быть объявлен в внешней области видимости. Иначе вы получите ошибку ReferenceError или создадите новую переменную.

Для нескольких промисов, которые заполняют разные индексы, лучше использовать Promise.all - он гарантирует, что все промисы завершены, и вы можете заполнить массив в нужном порядке. Без этого индексы могут заполниться в произвольном порядке, если промисы завершаются в разное время.

На практике

На практике чаще всего встречаются два сценария:

  1. Одиночный промис - просто присваиваем в then или через await.
  2. Массив промисов - используем Promise.all и затем маппим результаты в нужные индексы.

Для "горячего" заполнения (когда промисы запускаются сразу, а не последовательно) важно не использовать await в цикле - это замедлит выполнение. Вместо этого запустите все промисы, соберите их в массив и дождитесь через Promise.all.

Пример кода

JAVASCRIPT
// Одиночный промис
const arr = [];
const promise = Promise.resolve(42);
promise.then(value => {
arr[0] = value;
});
// Через async/await
async function fillArray() {
const arr = [];
const value = await Promise.resolve(42);
arr[0] = value;
return arr;
}
// Несколько промисов с Promise.all
const promises = [
Promise.resolve('a'),
Promise.resolve('b'),
Promise.resolve('c')
];
Promise.all(promises).then(results => {
const arr = [];
results.forEach((value, index) => {
arr[index] = value;
});
// или просто: const arr = results;
});

Как отвечать на собеседовании

Начните с прямого ответа: "Через then или await". Затем покажите понимание асинхронности - подчеркните, что присваивание происходит после завершения промиса. Упомяните Promise.all для параллельных операций. Если спросят про порядок - объясните, что без Promise.all порядок не гарантирован. Можно добавить про Promise.allSettled, если нужно обработать ошибки отдельных промисов.

Что проверяет интервьюер

Интервьюер проверяет:

  • понимание асинхронности и event loop;
  • умение работать с колбэками и async/await;
  • знание Promise.all и его отличий от последовательного выполнения;
  • понимание области видимости переменных.

Типичные ошибки

  • Присваивание результата до объявления массива - ReferenceError.
  • Использование await в цикле для параллельных промисов - замедление.
  • Заполнение индексов без Promise.all - непредсказуемый порядок.
  • Забыть обработать reject - необработанное исключение.

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

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