async/await siempre devuelve la promesa
Estoy probando la funcionalidad asíncrona/en espera. Tengo este código que imita una solicitud:
const getJSON = async () => {
const request = () => new Promise((resolve, reject) => (
setTimeout(() => resolve({ foo: 'bar'}), 2000)
));
const json = await request();
return json;
}
Cuando uso el código de esta manera
console.log(getJSON()); // returns Promise
devuelve una promesa
pero cuando llamo a esta línea de código
getJSON().then(json => console.log(json)); // prints { foo: 'bar' }
imprime json como se esperaba
¿Es posible utilizar sólo código como console.log(getJSON())
? ¿Qué no entiendo?
Cada async
función devuelve un Promise
objeto . La await
declaración opera en a Promise
, esperando hasta s Promise
resolve
o reject
s.
Entonces no, no puedes hacerlo console.log
directamente con el resultado de una función asíncrona, incluso si usas await
. El uso await
hará que su función espere y luego devolverá un mensaje Promise
que se resuelve inmediatamente, pero no lo desenvolverá Promise
por usted. Aún necesita desenvolver lo Promise
devuelto por la async
función, ya sea usando await
o usando .then()
.
Cuando usa .then()
en lugar de console.log
ging directamente, el .then()
método pone a su disposición el resultado de la Promesa. Pero no se puede obtener el resultado Promise
desde fuera de la Promesa. Eso es parte del modelo de trabajo con Promesas.
Una función definida con async
siempre devuelve un Promise
. Si devuelve cualquier otro valor que no sea Promise
, se incluirá implícitamente en Promise
. La declaración const json = await request();
desenvuelve lo Promise
devuelto por request()
un objeto simple { foo: 'bar' }
. Luego, esto se envuelve en a Promise
antes de ser devuelto, getJSON
por lo que a Promise
es lo que finalmente obtienes cuando llamas getJSON()
. Entonces, para desenvolverlo, puede llamar getJSON().then()
como lo hizo o hacerlo await getJSON()
para obtener el valor resuelto.
El valor de retorno de una función asíncrona siempre será un objeto AsyncFunction , que devolverá un Promise
cuando se llame. No puedes cambiar ese tipo de devolución. El objetivo async/await
es esperar fácilmente a que se complete otro proceso asíncrono dentro de una función asíncrona.