Promise.race în JavaScript

Cod asincron ES2015 (ES6)

Returnează rezultatul (sau eroarea) primei promisiuni care se termină.

Sintaxă
const primul = await Promise.race([promisiune1, promisiune2, ...]);

Ce face Promise.race

Promise.race se termină la fel ca prima promisiune care se termină: împlinită dacă aceea reușește, respinsă dacă aceea eșuează. Celelalte continuă în fundal, dar rezultatul lor este ignorat.

Folosirea clasică este limita de timp: întreci operația cu o promisiune care eșuează după câteva secunde. Pentru fetch, varianta modernă este AbortSignal.timeout, care oprește cu adevărat cererea.

Parametri

Parametru Descriere
promisiuni Un iterabil cu promisiuni.

Ce returnează

O Promise care se termină ca prima promisiune terminată.

Exemple

Exemplul 1: Limită de timp pentru o operație

const pauza = (ms, valoare) => new Promise((resolve) => setTimeout(() => resolve(valoare), ms));
const esec = (ms, mesaj) => new Promise((_, reject) => setTimeout(() => reject(new Error(mesaj)), ms));

async function cuLimita(promisiune, ms) {
  return Promise.race([promisiune, esec(ms, `Depășit timpul de ${ms} ms`)]);
}

console.log(await cuLimita(pauza(100, "rapid"), 500));
try {
  await cuLimita(pauza(800, "lent"), 300);
} catch (e) {
  console.log(e.message);
}

Rezultat

rapid
Depășit timpul de 300 ms

Greșeli frecvente

  • Te aștepți ca operațiile pierzătoare să fie oprite. race doar ignoră rezultatul lor; pentru oprire folosește AbortController.

Comenzi înrudite

  • Promise.any: Returnează rezultatul primei promisiuni reușite; eșuează doar dacă toate eșuează.
  • AbortController / AbortSignal.timeout: Oprește o cerere fetch sau altă operație asincronă: la comandă, după un timp sau la primul dintre mai multe semnale.
  • setTimeout / setInterval: Rulează o funcție după o pauză (setTimeout) sau în mod repetat, la intervale egale (setInterval).