Реализуйте Promise.all
Вопрос
Проговорите реализацию Promise.all и чем от неё отличались бы allSettled, race и any.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Возвращаем `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 ошибок.