Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

253
Vistas
Debido a que no puedo ejecutar await en el nivel superior, tengo que ponerlo en una función asíncrona. ¿Por qué puedo llamar a esa función asíncrona directamente?

Tengo un script corto de Node.js donde necesito otro paquete y llamo a una función asíncrona desde él y luego quiero imprimir el valor de retorno. Si simplemente await el valor devuelto desde el nivel superior, obtendré un error que dice que solo puedo usar await dentro de una función asíncrona. Así que aparentemente el camino a seguir es así:

 async function main() { foo = await someOtherAsyncFunc(); console.log(foo); } main()

O:

 (async function() { foo = await someOtherAsyncFunc(); console.log(foo); })();

O:

 (async () => { foo = await someOtherAsyncFunc(); console.log(foo); })();

(Crédito a VLAZ en el chat https://chat.stackoverflow.com/transcript/message/54186176#54186176 )

Esto funciona, pero quiero entender un poco más las razones detrás de esto: estoy acostumbrado a no poder usar directamente await desde el nivel superior. Sin embargo, también estoy acostumbrado a tener que llamar a alguna función de biblioteca especial para realmente "aventurarme" en asíncrono desde el nivel superior. En Python, vea asyncio.run por ejemplo. ¿Cuál es el punto de requerir que await esté dentro de una función asíncrona, si luego puedo llamar a cualquier función asíncrona desde el nivel superior? Entonces, ¿por qué await no está disponible también en el nivel superior?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

La espera de nivel superior solía no existir, pero ahora es posible en los módulos ES6.

Una de las razones por las que la espera de nivel superior solía no ser una cosa, y todavía no es una cosa fuera de los módulos, es que podría permitir la ambigüedad sintáctica.Async y await son nombres de variables válidos. fuera de los módulos. Si una secuencia de comandos que no es de módulo permitiera una espera de nivel superior, entonces, salvo volver a trabajar en la especificación (y romper la compatibilidad con versiones anteriores), habría circunstancias en las que el analizador no podría determinar si una instancia particular de await era un nombre de variable, o se usó como la sintaxis para esperar a que se resuelva la Promesa en su lado derecho.

Para evitar cualquier posibilidad de ambigüedad, el analizador, al analizar una sección de código, esencialmente necesita tener indicadores que indiquen si await es válido como identificador en un punto dado, o si es válido como sintaxis asíncrona, y esos dos nunca deben cruzarse .

Los scripts de módulo permiten await de nivel superior (ahora) porque el uso de await como identificador siempre ha estado prohibido en ellos, por lo que no hay ambigüedad sintáctica.

Por el contrario, no hay problemas con el uso de .then en el nivel superior porque no genera ninguna ambigüedad en ninguna circunstancia.

¿Por qué simplemente no devuelve una Promesa que nunca se ejecuta porque no se espera?

Las promesas no se "ejecutan" realmente. Se pueden construir, o esperar a que se cumplan, o esperar a que se rechacen. Si tiene una Promesa, ya tiene un código en curso que (probablemente) eventualmente resultará en la asignación de un valor de cumplimiento a la Promesa.

Las promesas colgantes están permitidas sintácticamente: valores que se resuelven en promesas pero con los que no interactúan en ningún otro lugar. (Lo cual tiene sentido: cada .then o .catch produce una nueva Promesa. Si cada Promesa tuviera que ser utilizada por otra cosa, terminaría con una regresión infinita).

Haciendo

 (async () => { foo = await someOtherAsyncFunc(); console.log(foo); })();

es esencialmente azúcar de sintaxis para

 someOtherAsyncFunc() .then((foo) => { console.log(foo); });

No hay necesidad de agregar nada más al final de ninguno de esos. (aunque se recomienda agregar un .catch a una Promesa colgante para que no se produzcan rechazos no controlados)

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda