Vai al contenuto principale
Pubblicato il

Async/Await in JavaScript

Condividi:

Introduzione

L'introduzione di async e await in JavaScript ES7 ha segnato un progresso significativo nel modo di scrivere e gestire il codice asincrono. Questo articolo esplora in dettaglio come utilizzare async e await per gestire diverse situazioni asincrone, con un'enfasi sui pattern avanzati e sulle best practice.

Concetti Fondamentali di Async/Await

Async

Una funzione dichiarata come async restituisce implicitamente una Promise, e il valore restituito dalla funzione viene utilizzato per risolvere tale Promise.

async function operazioneAsincrona() {
  return 'Risultato';
}

// Restituisce una Promise che si risolve con 'Risultato'

Await

Await viene utilizzato all'interno di funzioni async per mettere in pausa l'esecuzione della funzione fino a quando la Promise non viene risolta o rifiutata.

async function ottenereIdati(url) {
  let risposta = await fetch(url);
  let dati = await risposta.json();

  return dati;
  // L'esecuzione si mette in pausa fino alla risoluzione della Promise di fetch
}

Pattern Avanzati di Utilizzo

Esecuzione Parallela

Per eseguire operazioni asincrone in parallelo, puoi usare Promise.all con await.

async function caricareIdatiParalleli(urls) {
  let promises = urls.map((url) => fetch(url).then((res) => res.json()));
  return await Promise.all(promises);
}

Await in un Ciclo

Sebbene in genere si raccomandi di evitare await all'interno dei cicli, in certi casi — ad esempio quando le operazioni devono essere sequenziali — può essere necessario.

async function elaborazioneSequenziale(urls) {
  for (let url of urls) {
    let dati = await fetch(url).then((res) => res.json());
    console.log(dati);
  }
}

Gestione degli Errori con Async/Await

La gestione degli errori nelle funzioni async viene effettuata tramite blocchi try-catch.

Catturare gli Errori

async function caricareIdati(url) {
  try {
    let risposta = await fetch(url);
    return await risposta.json();
  } catch (errore) {
    console.error('Errore nel caricamento dei dati:', errore);
  }
}

Best Practice e Consigli

  1. Usa Async/Await nei Contesti Appropriati: Evita di usare async e await per operazioni semplici che non traggono vantaggio dall'asincronia.
  2. Evita l'Await Inutile: Non usare await con operazioni già sincrone, poiché ciò può introdurre ritardi non necessari.
  3. Combina con le Promises quando Necessario: In situazioni complesse, la combinazione di async/await con la tradizionale API delle Promises può offrire maggiore flessibilità.
  4. Usa Async/Await per Semplificare il Codice Asincrono: Invece di concatenare più Promises con .then(), considera di ristrutturare il codice usando async/await per una maggiore chiarezza.

Demistificare Async/Await

Errori Comuni

  • Dimenticare await: Dimenticare di aggiungere await può portare a comportamenti inaspettati, poiché il codice successivo potrebbe essere eseguito prima del completamento dell'operazione asincrona.
  • Blocco Involontario: L'uso improprio di await può bloccare l'esecuzione di altre importanti operazioni asincrone.

Utilizzo nelle Funzioni Anonime

Async/await può essere utilizzato anche nelle funzioni anonime:

document.addEventListener('click', async function () {
  let dati = await caricareIdati('https://api.esempio.com');
  console.log(dati);
});

Conclusione

Async e await hanno trasformato l'approccio alla programmazione asincrona in JavaScript, rendendo il codice più intuitivo e facile da seguire. Capire come applicare questi concetti in modo efficiente è fondamentale per qualsiasi sviluppatore che lavori con JavaScript, soprattutto nelle moderne applicazioni web che dipendono fortemente dalle operazioni asincrone.

Happy coding!