Promise / then în JavaScript

Cod asincron ES2015 (ES6)

O promisiune reprezintă un rezultat care va veni mai târziu: o cerere la server, un fișier citit, o pauză.

Sintaxă
new Promise((resolve, reject) => { ... })
promisiune.then(rezultat => ...).catch(eroare => ...)

Ce face Promise / then

O Promise (promisiune) este un obiect care va primi un rezultat în viitor. Ea este fie împlinită (cu resolve), fie respinsă cu o eroare (cu reject).

Cu .then() spui ce faci cu rezultatul, cu .catch() tratezi eroarea, iar .finally() rulează în ambele cazuri. Promise.all așteaptă mai multe promisiuni în paralel.

În codul nou, promisiunile se folosesc de obicei cu async și await, care sunt mai ușor de citit.

Ce returnează

Un obiect Promise.

Exemple

Exemplul 1: O promisiune împlinită și una respinsă

function verificaStoc(produs, stoc) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (stoc > 0) resolve(`${produs}: ${stoc} bucăți`);
      else reject(new Error(`${produs} nu mai este în stoc`));
    }, 100);
  });
}

verificaStoc("Laptop", 4)
  .then((mesaj) => console.log(mesaj))
  .catch((eroare) => console.log(eroare.message));

verificaStoc("Monitor", 0)
  .then((mesaj) => console.log(mesaj))
  .catch((eroare) => console.log(eroare.message));

Rezultat

Laptop: 4 bucăți
Monitor nu mai este în stoc

Exemplul 2: Mai multe promisiuni deodată cu Promise.all

const pauza = (ms, valoare) => new Promise((resolve) => setTimeout(() => resolve(valoare), ms));

Promise.all([pauza(300, "utilizatori"), pauza(100, "articole")]).then((rezultate) => {
  console.log(rezultate);
});

Rezultat

[ 'utilizatori', 'articole' ]

Greșeli frecvente

  • Uiți .catch(). O promisiune respinsă și netratată afișează Uncaught (in promise) în consolă, iar în Node.js oprește programul.
  • Uiți return într-un .then() cu acolade, iar următorul .then() primește undefined.

Comenzi înrudite

  • async / await: Scrie cod asincron care se citește ca un cod obișnuit, de sus în jos.
  • fetch: Trimite o cerere HTTP la un server și primește răspunsul, fără reîncărcarea paginii.
  • setTimeout / setInterval: Rulează o funcție după o pauză (setTimeout) sau în mod repetat, la intervale egale (setInterval).