JavaScript Promise.race() — перша обіцянка, що завершилась
Promise.race() (у перекладі — перегони) повертає результат першої обіцянки, що завершилась — байдуже, успіхом чи помилкою.
Загальний опис
Класичне застосування — таймаут. Ставимо на перегони запит і затримку: якщо запит не встиг за три секунди, перемагає затримка, і ми чесно кажемо «сервер не відповідає».
Важливо розуміти: програвши перегони, обіцянка не скасовується. Запит усе одно долетить до сервера й повернеться — просто його результат уже нікому не потрібен. Щоб справді обірвати запит, потрібен AbortController.
Перша ж помилка теж виграє перегони — тобто race падає, якщо найшвидшою виявилась невдача.
- Порада
-
Для таймауту
автор: NagarDfetchсьогодні є коротший шлях:AbortSignal.timeout(3000)— він і запит обірве, а не лише перестане його чекати.
Переглядачі
| Переглядач | ||||||
|---|---|---|---|---|---|---|
| race | 32+ | 29+ | 8+ | 19+ | 12+ | - |
| Переглядач | ||||
|---|---|---|---|---|
| race | 32+ | yes | yes | 8+ |
Приклади
+ запропонувати свій приклад у пісочниці
Таймаут запиту через перегони із затримкою.
// top-level await працює лише в модулях — тут той самий код в async-функції
(async () => {
const timeout = ms => new Promise((_, reject) =>
setTimeout(() => reject(new Error('Час вийшов')), ms)
);
try {
const data = await Promise.race([
fetch('/api/slow').then(r => r.json()),
timeout(3000),
]);
console.log(data);
} catch (error) {
console.error(error.message); // 'Час вийшов'
}
// увага: програвши перегони, запит НЕ скасовується —
// для справжнього обриву потрібен AbortController
})();
Коментарі
Коментарів ще немає — будьте першим!