Soy nuevo en las promesas de JavaScript. Estoy intentando el siguiente código:
async function handlePromises() { var promise1 = new Promise((resolve, reject) => { console.log(`Creating promise1 object at ${new Date(Date.now()).toISOString()}`); setTimeout(() => { resolve(`Promise 1 resolved after 10 seconds at ${new Date(Date.now()).toISOString()}`); }, 10000); }); let promise2 = new Promise((resolve, reject) => { console.log(`Creating promise2 object at ${new Date(Date.now()).toISOString()}`); setTimeout(() => { resolve(`Promise 2 resolved after 5 seconds at ${new Date(Date.now()).toISOString()}`); }, 5000); }); let promise3 = new Promise((resolve, reject) => { console.log(`Creating promise3 object at ${new Date(Date.now()).toISOString()}`); setTimeout(() => { resolve(`Promise 3 resolved after 3 seconds at ${new Date(Date.now()).toISOString()}`); }, 3000); }); let promise4 = new Promise((resolve, reject) => { console.log(`Creating promise4 object at ${new Date(Date.now()).toISOString()}`); setTimeout(() => { resolve(`Promise 4 resolved after 4 seconds at ${new Date(Date.now()).toISOString()}`); }, 4000); }); return Promise.all([promise1, promise2, promise3, promise4]); } handlePromises();Ahora estoy tratando de llamar a la función anterior desde la llamada de la siguiente función:
async function handlePromisesUsingAsync() { let getPromisesArray = handlePromises(); getPromisesArray.then((value) => console.log(value)); }Esta llamada imprime la salida como se esperaba:
Pero cuando cambio la definición del método handlePromisesUsingAsync al siguiente código (observe la adición de la palabra clave await):
async function handlePromisesUsingAsync() { let getPromisesArray = await handlePromises(); getPromisesArray.then((value) => console.log(value)); }Obtuve el siguiente error:
¿Por qué esto es tan? ¿La MISMA función no devuelve la MISMA Promesa cumplida en ambas llamadas?
await esperará a que se resuelva el entonces-capaz en su lado derecho, y luego la expresión completa se evaluará a ese valor resuelto. Por ejemplo
(async () => { const containsTwo = await Promise.resolve(2); console.log(containsTwo); })(); containsTwo no es una Promesa, es el valor resuelto que la sección de await extrajo de Promise.resolve . containsTwo es solo un número simple.
Del mismo modo, si lo hace
let getPromisesArray = await handlePromises(); getPromisesArray ya no es una matriz de Promises, sino una matriz de valores de resolución , ya que await la llamada de Promise.all .
Al revisar el código, puede pensar en await como convertir las Promesas en lo que resuelven, sin dejar las Promesas atrás (a menos que algo más ya tenga una referencia a la Promesa creada).
Todo lo que necesitas es
const results = await handlePromises(); console.log(results);