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