Вопрос проверяет знание альтернативных методов для параллельного выполнения асинхронных операций в JavaScript, что необходимо для эффективного управления потоком выполнения.
В JavaScript для работы с несколькими асинхронными операциями параллельно часто используют Promise.all, но у него есть ограничение: если хотя бы один промис завершится с ошибкой, весь результат будет отклонён. Для более гибких сценариев существуют другие статические методы класса Promise.
Этот метод ждёт, пока все переданные промисы завершатся (неважно, успешно или с ошибкой), и возвращает массив объектов с детализированными результатами. Каждый объект содержит статус (fulfilled или rejected) и значение либо причину ошибки. Это полезно, когда нужно обработать результаты всех операций, например, при отправке нескольких независимых запросов к API, где неудача одного не должна блокировать обработку остальных.
const promises = [
Promise.resolve('Успех 1'),
Promise.reject('Ошибка'),
Promise.resolve('Успех 2')
];
Promise.allSettled(promises).then(results => {
results.forEach(result => {
if (result.status === 'fulfilled') {
console.log('Успех:', result.value);
} else {
console.log('Ошибка:', result.reason);
}
});
});
// Вывод: Успех: Успех 1, Ошибка: Ошибка, Успех: Успех 2Метод возвращает результат первого завершившегося промиса (будь то успех или ошибка). Это можно использовать для реализации таймаутов или выбора самого быстрого источника данных. Например, если у вас есть два сервера, вы можете запустить запросы к обоим и взять ответ от того, который ответит первым.
const fast = new Promise(resolve => setTimeout(() => resolve('Быстрый'), 100));
const slow = new Promise(resolve => setTimeout(() => resolve('Медленный'), 200));
Promise.race([fast, slow]).then(result => console.log(result)); // Вывод: БыстрыйЭтот метод похож на Promise.race, но возвращает результат первого успешно выполнившегося промиса. Если все промисы завершатся с ошибкой, будет отклонён с AggregateError, содержащим все ошибки. Это полезно, когда у вас есть несколько резервных источников, и вам нужен первый рабочий.
const p1 = Promise.reject('Ошибка 1');
const p2 = Promise.resolve('Успех 1');
const p3 = Promise.resolve('Успех 2');
Promise.any([p1, p2, p3]).then(result => console.log(result)); // Вывод: Успех 1Кроме этих методов, можно использовать последовательное выполнение с async/await в цикле или библиотеки типа async.js для сложных потоков, но встроенные методы покрывают большинство случаев.
Вывод: Используйте Promise.allSettled, когда нужны результаты всех операций, Promise.race для таймаутов или гонок, и Promise.any для получения первого успешного результата из нескольких источников. Это позволяет гибко управлять параллелизмом в асинхронном коде.