Сохраняйте результаты по индексам и считайте число незавершённых промисов. Пустой массив разрешается сразу, любое отклонение передаётся в reject итогового Promise.
Реализация собственного аналога Promise.all
Сохраняйте результаты по индексам и считайте число незавершённых промисов. Пустой массив разрешается сразу, любое отклонение передаётся в reject итогового Promise.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо написать полифил для статического метода Promise.all. Функция должна принимать массив промисов и возвращать новый промис, который разрешается массивом полученных значений или отклоняется при ошибке любого из переданных промисов.
function myPromiseAll(promisesArray) {
// реализация
}
Пример использования:
myPromiseAll([p1, p2, p3]).then(results => {
// обработка результатов
});
Ответ
Сохраняйте результаты по индексам и считайте число незавершённых промисов. Пустой массив разрешается сразу, любое отклонение передаётся в reject итогового Promise.
function myPromiseAll(promisesArray) {
return new Promise((resolve, reject) => {
const items = Array.from(promisesArray);
const results = new Array(items.length);
let remaining = items.length;
if (!remaining) return resolve(results);
items.forEach((item, index) => Promise.resolve(item).then(value => {
results[index] = value;
if (--remaining === 0) resolve(results);
}, reject));
});
}
Promise.resolve нормализует обычные значения и thenable. Уже запущенные операции не отменяются после первой ошибки. Реализация покрывает заданный контракт массива; это не буквальный полифил всех правил стандарта для наследования Promise и статического this.