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