Así que estaba pensando que ok node es asíncrono (lo que significa que se ejecutan varias líneas de código al mismo tiempo), entonces, ¿por qué usamos la palabra clave async (que literalmente significa asíncrono) para esperar a que se realice una tarea con la palabra clave await (que está haciendo es sincrónico). ¿Por qué no hay una sincronización de palabras clave, porque eso es lo que estamos haciendo? ¿Puede alguien explicar la lógica de la palabra clave asíncrona? Estoy muy confundido.
La palabra clave async permite el uso de await , que es solo una sintaxis más optimizada para escribir código con promesas y operaciones asincrónicas. No hace nada sincronizado. Simplemente le permite usar técnicas de programación similares a las del código síncrono, pero todo sigue siendo asíncrono.
¿Puede alguien explicar la lógica de la palabra clave asíncrona? Estoy muy confundido.
Cuando usa la palabra clave async para declarar una función, está creando un tipo diferente de función que SIEMPRE devuelve una promesa. Esto es útil solo para la programación asincrónica; por lo tanto, la afiliación de las palabras clave async con el término "asincrónico".
Además, la palabra clave async no hace que nada sea sincrónico. Le permite usar un modelo de programación más síncrono que es mucho más simple de usar, particularmente para cosas como ramas condicionales en el flujo de control asíncrono, pero nada de lo que era asíncrono en realidad se convierte en síncrono.
Como ejemplo de cómo nada se vuelve sincrónico, ejecute este ejemplo en el fragmento y observe el orden de las declaraciones de console.log() . La función async regresa cuando llega a la primera await y el resto de la ejecución continúa y la operación asíncrona continúa. Esta es una simulación con un temporizador, pero ese temporizador podría ser cualquier otra operación asíncrona, como una solicitud http, una operación de base de datos, etc.
function delay(t) { return new Promise(resolve => { setTimeout(resolve, t); }); } async function run() { console.log("in run() 1"); await delay(100); console.log("in run() 2"); } console.log("before run()"); run(); console.log("after run()"); Al ejecutar este pequeño ejemplo, puede ver que la ejecución de la función run() se suspende tan pronto como presiona await y regresa permitiendo que se ejecute el otro código después de la llamada a la función. Luego, algún tiempo después, cuando el temporizador se dispara y la promesa de delay() se resuelve, la función run() continúa donde se suspendió y ejecuta el resto del cuerpo de la función.
Esto es operativamente lo mismo que este código usando .then() en lugar de async y await :
function delay(t) { return new Promise(resolve => { setTimeout(resolve, t); }); } function run() { console.log("in run() 1"); delay(100).then(() => { console.log("in run() 2"); }); } console.log("before run()"); run(); console.log("after run()");Node.js no es "asincrónico", sino que tiene un conjunto de API asincrónicas.
Para responder a su pregunta sobre async/await - async/await es solo azúcar sintáctica, ya que utiliza promesas ocultas.