> Как положить результат промиса в массив по индексу в JavaScript? (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: РСХБ
Стек: JavaScript
> Пример ответа
Короткий ответ
Результат промиса можно положить в массив по индексу через then с присваиванием arr[index] = value, либо через async/await с прямым присваиванием. Важно учитывать, что промис асинхронный, поэтому массив должен существовать до выполнения колбэка. Для параллельного заполнения нескольких индексов используйте Promise.all, чтобы дождаться всех результатов.
Подробное объяснение
Промис - это асинхронная операция, результат которой становится доступен после вызова resolve или reject. Присваивание по индексу - обычная операция с массивом, но она должна выполняться внутри колбэка then или после await.
Ключевой момент: если вы присваиваете результат по индексу, массив уже должен быть объявлен в внешней области видимости. Иначе вы получите ошибку ReferenceError или создадите новую переменную.
Для нескольких промисов, которые заполняют разные индексы, лучше использовать Promise.all - он гарантирует, что все промисы завершены, и вы можете заполнить массив в нужном порядке. Без этого индексы могут заполниться в произвольном порядке, если промисы завершаются в разное время.
На практике
На практике чаще всего встречаются два сценария:
- Одиночный промис - просто присваиваем в
thenили черезawait. - Массив промисов - используем
Promise.allи затем маппим результаты в нужные индексы.
Для "горячего" заполнения (когда промисы запускаются сразу, а не последовательно) важно не использовать await в цикле - это замедлит выполнение. Вместо этого запустите все промисы, соберите их в массив и дождитесь через Promise.all.
Пример кода
JAVASCRIPT// Одиночный промисconst arr = [];const promise = Promise.resolve(42);promise.then(value => {arr[0] = value;});// Через async/awaitasync function fillArray() {const arr = [];const value = await Promise.resolve(42);arr[0] = value;return arr;}// Несколько промисов с Promise.allconst 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- необработанное исключение.
> Похожие задачи по frontend
Что такое типизация в JavaScript?
Какие бандлеры существуют и для чего они используются
Вернёт ли метод map в JavaScript новый массив с новыми объектами или с теми же старыми объектами при добавлении свойства к объектам?
Что такое генераторы в JavaScript и для чего они используются
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью