Estoy tratando de entender async/await y entender la diferencia de await frente a simplemente llamar a la función tal cual, sería sincrónico de todos modos, ¿verdad?
function foo() { this.doSomething(); // waits for this to run before going to next line return "1"; } async foo() { await this.doSomething(); // waits for this to run before going to next line return "1"; } ¿No están ambos esperando que termine doSomething() ?
Si doSomething() es una función async o devuelve una Promesa: entonces el primer ejemplo no espera a que se complete lo que suceda dentro de doSomething() . doSomething() aún se ejecutará, pero fuera del flujo de ejecución de foo() .
Si doSomething() es una función síncrona: entonces ambos ejemplos no difieren.
Más explicación: el concepto de async/await gira en torno a Promise , por lo que para comprender async/await debe comprender Promise primero. Una Promise consta de una operación asincrónica y un valor de retorno futuro de esa operación asincrónica.
El modificador async hace que una función sea asíncrona al hacer que devuelva una Promise . Cada vez que llama a una función async , el contenido de la función en realidad se envuelve en una Promise y se ejecuta fuera del flujo del sitio de llamada. Una simple llamada de una función async devolverá una Promesa en lugar del valor de la función.
async function intFunction() { return 1 } function foo() { const result = intFunction(); // result is actually a Promise, not 1. console.log(result instanceof Promise); // should print true } foo(); La palabra clave await "espera" una Promise . Cada vez que llama await con Promise , Promise se ejecuta, el resultado se espera y se devuelve en el mismo contexto de ejecución en el que lo llamó. Por lo tanto, solo tiene sentido poder llamar en await solo en un contexto asíncrono, por lo que no bloqueará el único subproceso del motor JS.
async function intFunction() { return 1 } async function foo() { const promise = intFunction(); const value = await promise; console.log(value === 1); // should be true } foo(); // You can call an asynchronous function in the outermost context in running Node.js, // the engine will wait for all those functions to finish before exiting.