Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

257
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!