Ответ вслух Middle Реализация с нуля спрашивают часто обновлено

Реализуйте Promise.all

Вопрос

Проговорите реализацию Promise.all и чем от неё отличались бы allSettled, race и any.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Образцовый ответ: «Функция возвращает новый промис. Вход превращаю в массив через Array.from, потому что настоящий Promise.all принимает любой итерируемый.

Что должно прозвучать в ответе

  • Возвращаем `new Promise`, перебираем вход через `Array.from`

  • Каждый элемент через `Promise.resolve(item).then(...)`

  • Результат по индексу, счётчик завершённых, `resolve` когда счётчик равен длине

  • Первая ошибка вызывает `reject`; пустой вход сразу выполняется `[]`

  • `allSettled`: пишем `{status, value/reason}` и никогда не отклоняемся

  • `race`: подписываем `resolve`/`reject` на всех; `any`: копим ошибки, `AggregateError` когда упали все

Что могут спросить следом

  • Почему нельзя проверять готовность по results.length?
  • Что будет, если передать в ваш promiseAll строку 'abc'?
  • Как добавить ограничение параллельности?

Разбор

Образцовый ответ: «Функция возвращает новый промис. Вход превращаю в массив через Array.from, потому что настоящий Promise.all принимает любой итерируемый. Заводим массив результатов той же длины и счётчик. Если длина ноль, сразу резолвлю пустым массивом, иначе промис зависнет. Каждый элемент оборачиваю в Promise.resolve, чтобы поддержать обычные значения, и подписываюсь: в успехе записываю значение по его индексу, увеличиваю счётчик и, когда он равен длине, резолвлю массив. По индексу важно, чтобы порядок совпадал с входом, а не со временем завершения. results.length для проверки не годится: запись в последний индекс сразу делает длину полной. Ошибку передаю прямо в reject: первая отклонит промис, остальные проигнорируются. allSettled такой же, но и в успехе, и в ошибке пишет объект со статусом и никогда не отклоняется. race проще всего: подписываю resolve и reject на все элементы. any зеркален all: первый успех резолвит, ошибки копятся по индексам, и когда упали все, отклоняю AggregateError. Ограничение параллельности делается очередью с пулом из N работников».

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.