timers/promises (setTimeout cu await) în Node.js

Sistem, procese și fire Node.js 15.0 (stabil din 16.0)

Variantele cu promisiuni ale temporizatoarelor: await setTimeout(1000) pentru o pauză, setInterval ca iterator asincron.

Sintaxă
import { setTimeout, setInterval, setImmediate } from "node:timers/promises";
await setTimeout(ms, [valoare], [{ signal }]);
for await (const v of setInterval(ms, [valoare])) { ... }

Ce face timers/promises (setTimeout cu await)

Modulul node:timers/promises are funcțiile setTimeout, setImmediate și setInterval, dar fără callback. await setTimeout(500) face o pauză de jumătate de secundă, fără new Promise(...) scris de mână. Al doilea argument este valoarea cu care se rezolvă promisiunea.

setInterval întoarce un iterator asincron: îl parcurgi cu for await, iar break oprește intervalul. Toate primesc opțiunea signal de la un AbortController: la anulare, promisiunea este respinsă cu o eroare AbortError.

Funcțiile au aceleași nume ca temporizatoarele globale (setTimeout din browser și Node.js), de aceea mulți le importă cu alt nume: import { setTimeout as pauza } from "node:timers/promises".

Parametri

Parametru Descriere
ms Durata în milisecunde.
valoare Valoarea cu care se rezolvă promisiunea (opțional).
{ signal } Un AbortSignal care anulează temporizatorul.

Ce returnează

O promisiune (setInterval: un iterator asincron).

Exemple

Exemplul 1: Pauză între încercări

Funcția încearcă o operație de trei ori, cu pauză din ce în ce mai mare între încercări.

import { setTimeout as pauza } from "node:timers/promises";

let apeluri = 0;
async function trimiteComanda() {
  apeluri++;
  if (apeluri < 3) throw new Error("serverul nu răspunde");
  return "comanda 1024 trimisă";
}

for (let incercare = 1; incercare <= 3; incercare++) {
  try {
    console.log(await trimiteComanda());
    break;
  } catch (eroare) {
    console.log(`Încercarea ${incercare}: ${eroare.message}`);
    await pauza(incercare * 20);
  }
}

Rezultat

Încercarea 1: serverul nu răspunde
Încercarea 2: serverul nu răspunde
comanda 1024 trimisă

Exemplul 2: setInterval ca iterator

import { setInterval } from "node:timers/promises";

let secunde = 3;
for await (const _ of setInterval(10)) {
  console.log(`Lansare în ${secunde}...`);
  if (--secunde === 0) break;
}
console.log("Start!");

Rezultat

Lansare în 3...
Lansare în 2...
Lansare în 1...
Start!

Exemplul 3: Anulare cu AbortController

import { setTimeout as pauza } from "node:timers/promises";

const ac = new AbortController();
const asteptare = pauza(5000, "gata", { signal: ac.signal });
ac.abort();

try {
  await asteptare;
} catch (eroare) {
  console.log(eroare.name, eroare.code);
}

Rezultat

AbortError ABORT_ERR

Greșeli frecvente

  • Importi setTimeout din node:timers/promises fără alt nume, apoi folosești forma veche setTimeout(fn, 100) în același fișier: acum primul argument trebuie să fie durata. Redenumește importul.
  • Uiți await: pauza(1000) fără await nu oprește nimic, codul continuă imediat.

Comenzi înrudite

  • EventEmitter (node:events): Clasa pentru evenimente din Node.js: înregistrezi ascultători cu on și îi declanșezi cu emit. Baza pentru stream-uri și servere.
  • worker_threads (Worker): Rulează cod JavaScript în fire de execuție separate, ca un calcul greu să nu blocheze restul programului.
  • util.promisify: Transformă o funcție cu callback în stil Node.js (eroare, rezultat) într-o funcție care întoarce o promisiune.