Programmazione asyncrona in javascript

JavaScript è a thread singolo per natura: non c'è parallelismo, solo concorrenza . 
La programmazione asincrona è alimentata da un ciclo di eventi , che consente di accodare una serie di attività e di eseguirne il polling per il completamento.
 
Esistono tre modi idiomatici per scrivere codice asincrono in JavaScript:
 
  • Basato su callback ( come setTimeout() )
  • Basato sulle Promise.
  • async/ await, che è un modo più leggibile per scrivere le promise.
 
Ad esempio, ecco come potrebbe apparire un'operazione di lettura di file in JavaScript:
 
 
Callback-based
 
fs.readFile(filename, (err, content) => {
  // This callback is invoked when the file is read, which could be after a while
  if (err) {
    throw err;
  }
  console.log(content);
});
// Code here will be executed while the file is waiting to be read
 
Promise-based
 
fs.readFile(filename)
  .then((content) => {
    // What to do when the file is read
    console.log(content);
  }).catch((err) => {
    throw err;
});

// Code here will be executed while the file is waiting to be read
 
Async/await
 
async function readFile(filename) {
  const content = await fs.readFile(filename);
  console.log(content);
}
 
Javascript base non specifica alcuna funzionalità di programmazione asincrona, ma è fondamentale quando si interagisce con l'ambiente esterno, dalla richiesta di autorizzazioni utente , al recupero dei dati , alla lettura dei file ecc.
Mantenere asincrone le operazioni potenzialmente di lunga durata garantisce che altri processi possano ancora essere eseguiti mentre questo attende, ad esempio, il browser non si bloccherà durante l'attesa che l'utente faccia clic su un pulsante per concedere l'autorizzazione.
Se hai un valore asincrono, non è possibile ottenerne il valore in modo sincrono. 
Ad esempio, se hai una Promise , puoi accedere all'eventuale risultato solo tramite il metodo then()
 
Allo stesso modo, await può essere utilizzato solo in un contesto asincrono, che di solito è una funzione asincrona o un modulo. 
Le Promise non bloccano mai : solo la logica che dipende dal risultato della promessa sarà differita; 
tutto il resto continua ad essere eseguito nel frattempo.