Innanzitutto, mi rendo conto di essere in ritardo nel rispondere a questa domanda.
Prima di discutere di sincrono e asincrono, esaminiamo brevemente come funzionano i programmi.
Nel caso sincrono , ogni istruzione viene completata prima dell'esecuzione dell'istruzione successiva. In questo caso il programma viene valutato esattamente nell'ordine delle dichiarazioni.
Ecco come funziona asincrono in JavaScript. Esistono due parti nel motore JavaScript, una parte che esamina il codice e accoda le operazioni e un'altra che elabora la coda. L'elaborazione della coda avviene in un thread, ecco perché può succedere solo un'operazione alla volta.
Quando viene visualizzata un'operazione asincrona (come la seconda query del database), il codice viene analizzato e l'operazione viene inserita nella coda, ma in questo caso viene registrato un callback da eseguire al termine dell'operazione. La coda potrebbe contenere già molte operazioni. L'operazione nella parte anteriore della coda viene elaborata e rimossa dalla coda. Una volta elaborata l'operazione per la query del database, la richiesta viene inviata al database e una volta completato il callback verrà eseguito al completamento. A questo punto, il processore di coda che ha "gestito" l'operazione passa all'operazione successiva, in questo caso
console.log("Hello World");
La query del database è ancora in fase di elaborazione, ma l'operazione console.log si trova nella parte anteriore della coda e viene elaborata. Essendo un'operazione sincrona viene eseguita immediatamente con conseguente risultato "Hello World". Qualche tempo dopo, l'operazione del database viene completata, solo allora viene richiamata ed elaborata la richiamata registrata con la query, impostando il valore del risultato della variabile su righe.
È possibile che un'operazione asincrona provocherà un'altra operazione asincrona, questa seconda operazione verrà inserita nella coda e quando verrà in primo piano verrà elaborata. La chiamata del callback registrato con un'operazione asincrona è il modo in cui il runtime JavaScript restituisce il risultato dell'operazione al termine.
Un metodo semplice per sapere quale operazione JavaScript è asincrona è notare se richiede un callback: il callback è il codice che verrà eseguito al termine della prima operazione. Nei due esempi nella domanda, possiamo vedere che solo il secondo caso ha un callback, quindi è l'operazione asincrona dei due. Non è sempre il caso a causa dei diversi stili di gestione del risultato di un'operazione asincrona.
Per saperne di più, leggi le promesse. Le promesse sono un altro modo in cui è possibile gestire il risultato di un'operazione asincrona. La cosa bella delle promesse è che lo stile di codifica sembra più un codice sincrono.
Molte librerie come il nodo 'fs' forniscono stili sia sincroni che asincroni per alcune operazioni. Nei casi in cui l'operazione non richiede molto tempo e non viene utilizzata molto - come nel caso della lettura di un file di configurazione - l'operazione di stile sincrono si tradurrà in codice più facile da leggere.