Vai al contenuto
eLearner.app
Modulo 7 · Lezione 1 di 425/32 nel corso~12 min
Lezioni del modulo (1/4)

Promise: cosa sono

Una Promise è un valore che rappresenta il risultato di un'operazione che terminerà in futuro. Può essere in tre stati:

  • pending — l'operazione è ancora in corso
  • fulfilled — è terminata con successo, c'è un valore
  • rejected — è fallita, c'è un errore

Una volta che esce dallo stato pending, è "decisa" per sempre.

Creare una Promise risolta

I due modi più comuni — non creerai quasi mai una Promise "a mano" col costruttore:

JS
const p1 = Promise.resolve(42);
const p2 = Promise.reject(new Error('oops'));

Leggere il risultato: .then / .catch

JS
Promise.resolve(10).then((v) => {
  console.log(v); // 10
});

Promise.reject(new Error('no')).catch((e) => {
  console.log(e.message); // 'no'
});

.then riceve una funzione che viene chiamata con il valore risolto. .catch riceve una funzione chiamata con l'errore in caso di rejection.

Concatenare

Ogni .then restituisce a sua volta una Promise: puoi concatenarli per trasformare il valore passo dopo passo.

JS
Promise.resolve(5)
  .then((n) => n * 2)
  .then((n) => n + 1)
  .then((n) => console.log(n)); // 11

Se uno qualunque dei .then lancia (o ritorna una Promise che fallisce), salta al primo .catch successivo.

Costruttore (raro)

JS
const p = new Promise((resolve, reject) => {
  if (Math.random() > 0.5) resolve('ok');
  else reject(new Error('no'));
});

Lo userai solo quando devi "promisificare" qualcosa che usa callback (es. vecchie API DOM o setTimeout).

Prova tu

Esercizio#js.m7.l1.e1
Tentativi: 0Caricamento…

Definisci `promisedVersion(n)` che, dato un numero, ritorna una Promise risolta col doppio di n.

Caricamento editor…
Mostra suggerimento

return Promise.resolve(n * 2)

Soluzione disponibile dopo 3 tentativi

Esercizio di ripasso

Esercizio#js.m7.l1.e2
Tentativi: 0Caricamento…

Definisci `incrementThree(p)` che riceve una Promise di numero e ritorna una Promise del numero + 3. Usa una catena .then.

Caricamento editor…
Mostra suggerimento

p.then((n) => n + 3)

Soluzione disponibile dopo 3 tentativi