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
awaithace que la ejecución de la funciónasyncse detenga hasta que se liquide unaPromise, [...]
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.
¿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).
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.
¿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.
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() .