Вопрос проверяет понимание работы Promise, асинхронности и агрегации результатов.
Аналог Promise.all можно реализовать, создав новый Promise и вручную отслеживая выполнение всех переданных Promise. Нужно сохранить результаты в массив в правильном порядке и считать количество завершённых операций. Если хотя бы один Promise отклоняется, итоговый Promise должен сразу перейти в состояние rejected. Это демонстрирует понимание базовой модели Promise.
Promise.all — это метод, который возвращает Promise, резолвящийся массивом результатов, когда все входные Promise успешно завершились.
Перед кодом важно понимать условия.
Сохранять порядок результатов
Резолвиться только после выполнения всех Promise
Реджектиться при первой ошибке
Поддерживать не-Promise значения
function promiseAll(promises) {
return new Promise((resolve, reject) => {
const results = [];
let completed = 0;
promises.forEach((p, index) => {
Promise.resolve(p)
.then(value => {
results[index] = value;
completed += 1;
if (completed === promises.length) {
resolve(results);
}
})
.catch(reject);
});
if (promises.length === 0) {
resolve([]);
}
});
}
Позволяет обрабатывать обычные значения
Делает поведение совместимым с Promise.all
Упрощает логику
Понимание внутреннего устройства Promise
Собеседования уровня Middle+
Отладка сложных асинхронных сценариев
Ручная реализация Promise.all показывает глубокое понимание асинхронности: очередей задач, обработки ошибок и синхронизации нескольких Promise.