Оборачивайте каждый элемент в Promise.resolve, складывайте результаты по индексам и завершайте общий Promise после всех успешных ответов. Первую ошибку передавайте в reject.
Создание собственного аналога Promise.all
Оборачивайте каждый элемент в Promise.resolve, складывайте результаты по индексам и завершайте общий Promise после всех успешных ответов. Первую ошибку передавайте в reject.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо написать функцию, которая принимает массив промисов и возвращает результат их совместного выполнения, воспроизводя поведение стандартного метода Promise.all.
const allPromise = () => {
}
allPromise(promises).then(response => console.log(response))
Ответ
Оборачивайте каждый элемент в Promise.resolve, складывайте результаты по индексам и завершайте общий Promise после всех успешных ответов. Первую ошибку передавайте в reject.
function allPromise(promises) {
return new Promise((resolve, reject) => {
const items = Array.from(promises);
if (!items.length) return resolve([]);
const values = new Array(items.length);
let remaining = items.length;
items.forEach((item, index) => Promise.resolve(item).then(value => {
values[index] = value;
if (--remaining === 0) resolve(values);
}, reject));
});
}
Порядок результатов соответствует входу, а не скорости операций. Обычные значения также поддерживаются. После reject остальные операции сами не отменяются. Это учебный аналог для переданного набора, без специфики конструкторов-подклассов Promise.