Primero, me doy cuenta de que llego tarde a responder esta pregunta.
Antes de analizar síncrono y asíncrono, veamos brevemente cómo se ejecutan los programas.
En el caso síncrono , cada declaración se completa antes de que se ejecute la siguiente. En este caso, el programa se evalúa exactamente en el orden de las declaraciones.
Así es como funciona asincrónico en JavaScript. Hay dos partes en el motor de JavaScript, una parte que mira el código y pone en cola las operaciones y otra que procesa la cola. El procesamiento de la cola ocurre en un hilo, es por eso que solo puede ocurrir una operación a la vez.
Cuando se ve una operación asincrónica (como la segunda consulta de la base de datos), el código se analiza y la operación se coloca en la cola, pero en este caso se registra una devolución de llamada para ejecutarse cuando se completa esta operación. La cola puede tener muchas operaciones en ella. La operación al frente de la cola se procesa y se elimina de la cola. Una vez que se procesa la operación para la consulta de la base de datos, la solicitud se envía a la base de datos y cuando se completa la devolución de llamada se ejecutará al finalizar. En este momento, el procesador de cola que ha "manejado" la operación se mueve en la siguiente operación, en este caso
console.log("Hello World");
La consulta de la base de datos todavía se está procesando, pero la operación console.log está al frente de la cola y se procesa. Esta es una operación síncrona que se ejecuta de inmediato, lo que resulta inmediatamente en la salida "Hello World". Algún tiempo después, la operación de la base de datos se completa, solo entonces se llama y procesa la devolución de llamada registrada con la consulta, estableciendo el valor del resultado variable en filas.
Es posible que una operación asincrónica dé como resultado otra operación asincrónica, esta segunda operación se colocará en la cola y cuando llegue al frente de la cola se procesará. Llamar a la devolución de llamada registrada con una operación asincrónica es cómo el tiempo de ejecución de JavaScript devuelve el resultado de la operación cuando se realiza.
Un método simple para saber qué operación de JavaScript es asíncrona es observar si requiere una devolución de llamada: la devolución de llamada es el código que se ejecutará cuando se complete la primera operación. En los dos ejemplos en la pregunta, podemos ver que solo el segundo caso tiene una devolución de llamada, por lo que es la operación asincrónica de los dos. No siempre es así debido a los diferentes estilos de manejo del resultado de una operación asincrónica.
Para obtener más información, lea sobre las promesas. Las promesas son otra forma de manejar el resultado de una operación asincrónica. Lo bueno de las promesas es que el estilo de codificación se parece más a un código síncrono.
Muchas bibliotecas, como el nodo 'fs', proporcionan estilos sincrónicos y asincrónicos para algunas operaciones. En los casos en que la operación no toma mucho tiempo y no se usa mucho, como en el caso de leer un archivo de configuración, la operación de estilo síncrono dará como resultado un código que es más fácil de leer.