back to top

Async Await in JavaScript: Guida Pratica

Hai mai avuto a che fare con callback annidate che ti hanno fatto impazzire? La gestione codice asincrono in JavaScript può sembrare complessa, ma con Async/Await tutto cambia. In questa guida scoprirai come Promises e la nuova sintassi async/await rendono il tuo codice più pulito, leggibile e semplice da debuggare.


Indice dei Contenuti

  1. Perché JavaScript ha bisogno di asincronia
  2. Cosa sono le Promises e come semplificano la gestione codice asincrono
    • Esempio di Promise
  3. Async e Await in JavaScript: la “nuova” sintassi per il codice asincrono
    • Come funziona
  4. Vantaggi di Async/Await
    • Async/Await vs Then
  5. Buone pratiche per il JavaScript asincrono
    • Gestione errori
  6. Esempio di chiamate multiple in parallelo
  7. In sintesi (TL;DR)
  8. FAQ – Domande Comuni
  9. Conclusioni
  10. Risorse Consigliate

1. Perché JavaScript ha bisogno di asincronia

JavaScript è un linguaggio single-threaded, il che significa che esegue una singola operazione alla volta. Se il thread principale fosse bloccato in attesa di una risposta da un’API esterna o durante un’operazione di I/O, l’interfaccia si congelerebbe. Ecco perché la gestione asincrona in JavaScript è fondamentale per mantenere l’applicazione reattiva e fluida.


2. Cosa sono le Promises e come semplificano la gestione codice asincrono

Le Promises sono oggetti che rappresentano il risultato (o l’errore) di un’operazione asincrona. Una promise può trovarsi in tre stati principali:

  • pending (in attesa)
  • fulfilled (risolta con successo)
  • rejected (terminata con errore)

Esempio di Promise (H3)

const fetchData = new Promise((resolve, reject) => {
  setTimeout(() => {
    const data = { id: 1, name: "Mario Rossi" };
    // Se tutto OK
    resolve(data);
    // In caso di errore: reject(new Error("Qualcosa è andato storto!"));
  }, 1000);
});

fetchData
  .then((res) => {
    console.log("Risultato:", res);
  })
  .catch((err) => {
    console.error("Errore:", err);
  });

In questo esempio, dopo 1 secondo la promise viene risolta con l’oggetto data. In caso di errore, avremmo usato reject().


3. Async e Await in JavaScript: la “nuova” sintassi per il codice asincrono

La combinazione async/await (introdotta in ES2017) è un syntactic sugar che semplifica l’utilizzo delle Promises, rendendo il tuo codice JavaScript asincrono molto più simile a quello sincrono.

Come funziona

  1. Una funzione dichiarata con la parola chiave async restituisce automaticamente una Promise.
  2. La parola chiave await può essere usata solo all’interno di una funzione async e “sospende” l’esecuzione fino a quando la Promise viene risolta o rigettata.
async function getData() {
  try {
    const response = await fetch("https://api.example.com/users/1");
    const user = await response.json();
    console.log("Utente:", user);
  } catch (error) {
    console.error("Errore durante il fetch:", error);
  }
}

getData();

In questo modo, il codice risulta molto più leggibile rispetto a una catena di .then(). Inoltre, è più facile gestire gli errori con un blocco try/catch.


4. Vantaggi di Async/Await

  • Leggibilità: il codice ricorda lo stile sincrono, riducendo il cosiddetto “callback hell”.
  • Debug più semplice: la gestione degli errori con try/catch è immediata.
  • Chiamate multiple in parallelo: si possono eseguire più operazioni in contemporanea con Promise.all, o gestire gli errori singolarmente con Promise.allSettled.

Async/Await vs Then

Una differenza essenziale tra async/await e .then() sta nella struttura del codice: con .then() si rischiano catene annidate, mentre con async/await si scrive un flusso più lineare. Quando vuoi evitare callback complessi o errori difficili da tracciare, preferisci async/await.


5. Buone pratiche per il JavaScript asincrono

Gestione errori

Racchiudi sempre il codice in blocchi try/catch quando usi await, per intercettare immediatamente le eccezioni. Se gestisci più Promises in parallelo, valuta quando usare Promise.allSettled() per non interrompere l’intera sequenza in caso di errore.


6. Esempio di chiamate multiple in parallelo

Quando hai necessità di effettuare più operazioni in parallelo, puoi sfruttare Promise.all:

async function fetchMultiple() {
  try {
    const [posts, users] = await Promise.all([
      fetch("https://api.example.com/posts").then(res => res.json()),
      fetch("https://api.example.com/users").then(res => res.json())
    ]);

    console.log("Post:", posts);
    console.log("Utenti:", users);
  } catch (error) {
    console.error("Errore nel fetch multiplo:", error);
  }
}

Questo approccio migliora le prestazioni perché le richieste vengono eseguite in contemporanea, anziché in serie.


7. In sintesi (TL;DR)

  • Async/Await semplifica la scrittura del codice asincrono.
  • Le Promises sono alla base di questa sintassi.
  • Usa try/catch per gestire facilmente gli errori.
  • Per operazioni in parallelo, Promise.all e Promise.allSettled sono i tuoi alleati.
  • Keywords: gestione codice asincrono, JavaScript asincrono, differenza async await then.

8. FAQ – Domande Comuni

  1. Quando usare async invece di .then()?
    Puoi usare .then() per operazioni veloci o catene semplici di Promises. Tuttavia, async/await rende il codice più leggibile e facile da gestire, specie quando aumentano complessità e chiamate annidate.
  2. Posso usare await fuori da una funzione async?
    No, await funziona solo all’interno di funzioni dichiarate con la parola chiave async. Se lo utilizzi altrove, otterrai un errore di sintassi.
  3. Qual è la differenza tra Promise.all e Promise.allSettled?
    • Promise.all interrompe l’esecuzione se una Promise va in errore.
    • Promise.allSettled ritorna un array con lo stato di tutte le Promises, consentendoti di gestire ogni risultato in modo indipendente.
  4. fetch() è l’unico modo per fare richieste HTTP in JavaScript?
    No. Ci sono anche librerie come Axios o la vecchia API XMLHttpRequest. Tuttavia, fetch è integrato nei browser moderni e si combina perfettamente con async/await.
  5. Dove posso approfondire la gestione asincrona in JavaScript?

9. Conclusioni

La sintassi async/await offre una gestione JavaScript asincrono più chiara ed elegante. Le Promises restano comunque la base su cui async/await è costruito, quindi è importante comprenderne il funzionamento. Con questi strumenti, sviluppare applicazioni JavaScript risulta più semplice e mantenibile.


10. Risorse Consigliate

Condividi

Articoli Recenti

Categorie popolari