He estado revisando async / await y después de revisar varios artículos, decidí probar las cosas yo mismo. Sin embargo, parece que no puedo entender por qué esto no funciona:
async function main() { var value = await Promise.resolve('Hey there'); console.log('inside: ' + value); return value; } var text = main(); console.log('outside: ' + text);La consola genera lo siguiente (nodo v8.6.0):
> exterior: [objeto Promesa]
> adentro: hola
¿Por qué el mensaje de registro dentro de la función se ejecuta después? Pensé que la razón por la que se creó async / await fue para realizar una ejecución síncrona usando tareas asíncronas.
¿Hay alguna manera de que pueda usar el valor devuelto dentro de la función sin usar .then() después de main() ?
La await de nivel superior se ha movido a la etapa 3, por lo que la respuesta a su pregunta ¿Cómo puedo usar async/await en el nivel superior? es simplemente usar await :
const text = await Promise.resolve('Hey there'); console.log('outside: ' + text) Si desea una función main() : agregue await a la llamada a main() :
async function main() { var value = await Promise.resolve('Hey there'); console.log('inside: ' + value); return value; } var text = await main(); console.log('outside: ' + text)--harmony-top-level-awaitLa mayoría de las respuestas anteriores están un poco desactualizadas o son muy detalladas, así que aquí hay un ejemplo rápido para el nodo 14 en adelante.
Cree un archivo llamado runme.mjs :
import * as util from "util"; import { exec as lameExec } from "child_process"; const exec = util.promisify(lameExec); const log = console.log.bind(console); // Top level await works now const { stdout, stderr } = await exec("ls -la"); log("Output:\n", stdout); log("\n\nErrors:\n", stderr); Ejecutar node runme.mjs
Output: total 20 drwxr-xr-x 2 mike mike 4096 Aug 12 12:05 . drwxr-xr-x 30 mike mike 4096 Aug 12 11:05 .. -rw-r--r-- 1 mike mike 130 Aug 12 12:01 file.json -rw-r--r-- 1 mike mike 770 Aug 12 12:12 runme.mjs Errors: