Promise.all принимает iterable значений/Promise, возвращает результаты в исходном порядке и отклоняется при первом отказе. Пустой вход даёт успешный Promise с [].
Реализуйте полифил Promise.all: что он принимает на вход и как должен работать при успешном выполнении, ошибке и пустом массиве?
Promise.all принимает iterable значений/Promise, возвращает результаты в исходном порядке и отклоняется при первом отказе. Пустой вход даёт успешный Promise с [].
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Promise.all принимает iterable значений/Promise, возвращает результаты в исходном порядке и отклоняется при первом отказе. Пустой вход даёт успешный Promise с [].
Учебная реализация без поддержки подклассов Promise:
function promiseAll(iterable) {
return new Promise((resolve, reject) => {
const results = [];
let remaining = 1;
let index = 0;
for (const item of iterable) {
const current = index++;
remaining++;
Promise.resolve(item).then(value => {
results[current] = value;
if (--remaining === 0) resolve(results);
}, reject);
}
if (--remaining === 0) resolve(results);
});
}
Promise.resolve нормализует обычные значения и thenables; ошибка обхода iterable отклоняет результат через executor. Отказ не отменяет уже запущенные операции, а порядок завершения не меняет индексы результата.