Riferimento rapido

Cheat Sheet Promises in JavaScript

Una guida rapida per le Promise in JavaScript: costruttore, concatenazione, gestione errori, combinatori (all, allSettled, race, any) e async/await.

· Pubblicato

Una Promise rappresenta il completamento futuro (o il fallimento) di un'operazione asincrona e il valore risultante.

Stati di una Promise

Una Promise si trova sempre in uno dei seguenti tre stati mutuamente esclusivi:

  1. pending (in attesa): Stato iniziale, ne completata ne rifiutata.
  2. fulfilled (risolta): Operazione completata con successo (resolve(valore)).
  3. rejected (rifiutata): Operazione fallita con errore (reject(errore)).

Costruttore e Concatenazione di Base

const loadUser = (id) => {
  return new Promise((resolve, reject) => {
    fetch(`/api/users/${id}`)
      .then((res) => {
        if (!res.ok) throw new Error(`HTTP ${res.status}`);
        return res.json();
      })
      .then((data) => resolve(data))
      .catch((err) => reject(err));
  });
};

loadUser(42)
  .then((user) => console.log('Caricato con successo:', user.name))
  .catch((err) => console.error('Error:', err.message))
  .finally(() => console.log('Richiesta conclusa'));

Metodi Statici di Risoluzione

// Promise risolta immediatamente
const p1 = Promise.resolve('Immediate value');

// Promise rifiutata immediatamente
const p2 = Promise.reject(new Error('Immediate failure'));

Combinatori di Promise

Metodo Comportamento Fallisce Quando
Promise.all([p1, p2]) Attende che tutte le promise siano risolte Qualsiasi promise viene rifiutata (interruzione immediata)
Promise.allSettled([p1, p2]) Attende che tutte le promise siano concluse Non fallisce mai
Promise.race([p1, p2]) Assume l'esito della prima promise che conclude La prima promise conclusa viene rifiutata
Promise.any([p1, p2]) Si risolve con la prima promise completata con successo Tutte le promise vengono rifiutate (AggregateError)
// Promise.all: Attende piu richieste indipendenti in parallelo
const [users, posts] = await Promise.all([
  fetchUsers(),
  fetchPosts()
]);

// Promise.allSettled: Controlla lo stato di tutte le richieste
const results = await Promise.allSettled([reqA(), reqB()]);
results.forEach((res) => {
  if (res.status === 'fulfilled') console.log('Value:', res.value);
  else console.error('Reason:', res.reason);
});

Modello Equivalente con Async / Await

async function getUserData(id) {
  try {
    const res = await fetch(`/api/users/${id}`);
    const data = await res.json();
    return data;
  } catch (err) {
    console.error('Failed to retrieve user:', err);
    throw err;
  }
}

Riferimenti

Argomenti correlati