async/await siempre devuelve la promesa

Resuelto user3309314 asked hace 7 años • 5 respuestas

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?

user3309314 avatar Apr 15 '17 13:04 user3309314
Aceptado

Cada asyncfunción devuelve un Promiseobjeto . La awaitdeclaración opera en a Promise, esperando hasta s Promise resolveo rejects.

Entonces no, no puedes hacerlo console.logdirectamente con el resultado de una función asíncrona, incluso si usas await. El uso awaithará que su función espere y luego devolverá un mensaje Promiseque se resuelve inmediatamente, pero no lo desenvolverá Promisepor usted. Aún necesita desenvolver lo Promise devuelto por la asyncfunción, ya sea usando awaito usando .then().

Cuando usa .then()en lugar de console.logging directamente, el .then()método pone a su disposición el resultado de la Promesa. Pero no se puede obtener el resultado Promisedesde fuera de la Promesa. Eso es parte del modelo de trabajo con Promesas.

Pedro Castilho avatar Apr 15 '2017 06:04 Pedro Castilho

Una función definida con asyncsiempre 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 Promisedevuelto por request()un objeto simple { foo: 'bar' }. Luego, esto se envuelve en a Promiseantes de ser devuelto, getJSONpor lo que a Promisees 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.

Seaworn avatar Jan 01 '2020 16:01 Seaworn

El valor de retorno de una función asíncrona siempre será un objeto AsyncFunction , que devolverá un Promisecuando se llame. No puedes cambiar ese tipo de devolución. El objetivo async/awaites esperar fácilmente a que se complete otro proceso asíncrono dentro de una función asíncrona.

Ozan avatar Apr 15 '2017 06:04 Ozan