Вопрос проверяет понимание механизма гонки промисов с дополнительным условием фильтрации и обработки всех результатов, а не только первого завершенного.
В стандартной гонке промисов (Promise.race) мы получаем результат самого быстрого промиса, игнорируя остальные. Однако часто требуется дождаться самого быстрого промиса, который удовлетворяет определенному условию, при этом не отбрасывая более медленные — они могут быть полезны для других целей или для повторной проверки.
Для этого можно создать функцию, которая принимает массив промисов и функцию-условие. Алгоритм работы:
Пример реализации на JavaScript:
async function raceWithPriority(promises, condition) {
let remaining = promises.map((p, i) => ({ promise: p, index: i }));
while (remaining.length > 0) {
const result = await Promise.race(
remaining.map(item => item.promise.then(value => ({ value, index: item.index })))
);
if (condition(result.value)) {
return result.value;
}
remaining = remaining.filter(item => item.index !== result.index);
}
throw new Error('No promise satisfied the condition');
}В этом коде мы оборачиваем каждый промис, чтобы сохранить его индекс. После каждого раунда удаляем промис, который не прошел условие, и повторяем гонку. Это гарантирует, что мы получим самый быстрый подходящий результат.
Такой подход полезен, когда у нас есть несколько источников данных (например, разные API или кэши), и мы хотим получить первый валидный ответ. Например, при загрузке изображений с разных CDN — берем первое успешно загруженное изображение, но если оно повреждено, ждем следующее.
Данная техника позволяет эффективно обрабатывать асинхронные операции с приоритетом по скорости, не теряя информацию о более медленных результатах. Она применима в системах с избыточностью данных или при необходимости быстрого получения корректного ответа из нескольких источников.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию