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

143
Views
¿Cuál es el punto de la palabra clave await dentro de una función asíncrona en términos de devolver un valor?

He investigado muchas publicaciones y artículos, y documentación. Estoy buscando una comprensión más profunda.

De https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await

La expresión await hace que la ejecución de la función async se detenga hasta que se liquide una Promise , [...]

 let fetchLocation = () => { //fetches information from satellite system and //returns a Vector2 of lat long on earth return new Promise(resolve => { setTimeout(() => { resolve({ lat: 73, long: -24 }); }, 2000); }); } //async functions automatically return a promise. let main = async() => { //awaits the promises resolution let result = await fetchLocation(); console.log("I'm the awaited promise result", result) //immediately returns a promise as promise pending return result; } console.log(main().then(res => console.log("I'm the original promise, just passed along by the async function, it didn 't a-wait for me", res)))

Antes de pasar por este agujero de conejo, sabía que async/await era azúcar sintáctico para hacer que el código asíncrono pareciera sincrónico.

Por lo tanto, esperaba ver que Main devolviera las coordenadas largas lat. En su lugar, devuelve una promesa.

Un par de preguntas.

  1. ¿La documentación de MDN es incorrecta? ¿No detiene realmente la ejecución? Parece que la palabra clave await en realidad no "pausa" la ejecución de la función... la invocación de main devuelve inmediatamente un objeto Promise<pending> . Sin embargo, luego de que regresa recibimos el valor de la promesa cumplida en la variable esperada result . ¿Supongo que esto vino del bucle de eventos? (Y una declaración de devolución asíncrona sigue siendo síncrona).

  2. Entonces, parece que await desenvuelve una promesa y async envuelve una promesa, pero debe usar await dentro de async. Entiendo que await podría ser en realidad una promesa. Entonces () debajo del capó, pero si quieren que tenga una apariencia completamente sincrónica, ¿por qué no hacer que la función asíncrona devuelva el valor prometido resuelto cuando se usa con await? De lo contrario, async await parece un poco redundante.

about 4 years ago · Juan Pablo Isaza
2 answers
Answer question

0

¿La documentación de MDN es incorrecta?

No

¿No detiene realmente la ejecución?

Hace una pausa en la ejecución de la función async , devuelve una Promesa a la función de llamada, porque no ha llegado al punto en la función async donde sabe qué devolver, luego la ejecución de la función de llamada (y el resto de la código) continúa.

Sin embargo, después de que regresa recibimos el valor de la promesa cumplida en la variable resultado esperada. ¿Supongo que esto vino del bucle de eventos?

Cuando el bucle de eventos deja de estar ocupado (ejecutando el código que llamó a la función async en primer lugar y cualquier otra cosa que recoja mientras tanto) y la promesa que estaba await se resuelve, entonces la función async se activa y se entrega el valor resuelto de la función para continuar con el procesamiento.

¿Por qué no hacer que la función asíncrona devuelva el valor prometido resuelto cuando se usa con await?

Porque eso bloquearía todo el ciclo de eventos, razón por la cual la lógica asíncrona (comenzando con las API de estilo de devolución de llamada) se introdujo en JS en primer lugar.

De lo contrario, async await parece un poco redundante.

Considere una situación en la que desea solicitar una cantidad de URL de una API en serie (para no enviar demasiadas solicitudes simultáneas a la API):

 const data = []; for (let i = 0; i < urls.length; i++) { const response = await fetch(urls[i]); const response_data = await response.json(); data.push(response_data); }

Si tuviera que reescribir eso sin await , entonces probablemente terminaría con algo recursivo para contar su camino a través del ciclo. Sería significativamente más complejo.

async / await simplifica el manejo de combinaciones complejas de promesas y trivial las promesas simples.

sabía que async/await era azúcar sintáctico para hacer que el código asíncrono pareciera sincrónico.

Y lo hace dentro de la función async y solo dentro de ella.

about 4 years ago · Juan Pablo Isaza Report

0

Realmente no pausa la función, solo le permite escribir el resto del código de la función como si lo fuera. Pero en realidad solo está envolviendo el resto del código de la función en un .then() .

P.ej

 await foo = someFunc(); console.log(foo);

se ejecuta como

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

Dado que todavía es asíncrono, no puede devolver el valor resuelto, porque la función de llamada original vuelve inmediatamente. Pero si la función de llamada también se declara async , devuelve una Promise , y la persona que llama puede usar await nuevamente (para que parezca sincrónico) o usar .then() .

about 4 years ago · Juan Pablo Isaza 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!