Tengo el siguiente código JS
async function readAtlasAll() {
return await MongoClient.connect(url, async function(err, db) {
var dbo = db.db("Users");
c = dbo.collection("List");
r = await c.find({}).toArray();
console.log(r);
return r;
});
}
console.log(readAtlasAll());
No estoy seguro de por qué, pero la impresión del resultado de readAtlasAll() viene antes de imprimir la variable r dentro de la función, aunque estoy esperando el resultado de r de antemano. El terminal imprime Promise { <pending> }
primero y luego imprime el contenido de r. Soy relativamente nuevo en JavaScript, por lo que realmente agradecería la ayuda. ¡Gracias!
Solución del problema
No puede usar ambos await
y una devolución de llamada simple en las llamadas a la API de MongoDB, ya await
que no hará nada útil. Usa uno u otro, no ambos. Esto se debe a que las API asíncronas de MongoDB devolverán una promesa si NO les pasa una devolución de llamada y luego puede await
esa promesa, pero si pasa una devolución de llamada, no devuelven una promesa, por lo tanto await
, no hace nada útil en absoluto. Así es como lo implementaría omitiendo la devolución de llamada y usando await
:
async function readAtlasAll() {
const db = await MongoClient.connect(url);
const dbo = db.db("Users");
const c = dbo.collection("List");
const r = await c.find({}).toArray();
return r; // this will be the resolved value of the returned promise
}
readAtlasAll().then(r => {
console.log(r);
}).catch(err => {
console.log(err);
});
Tenga en cuenta que await
no tiene poderes mágicos en absoluto. TODO lo que hace es suspender la ejecución de la función hasta que se resuelva/rechace una promesa. Entonces, solo hace algo útil cuando haces await
una promesa.
Y, además, TODAS async
las funciones devuelven una promesa, por lo que NO hay forma de devolver un valor recuperado de forma asíncrona directamente desde su función. Debe utilizar un mecanismo asíncrono para comunicar un valor recuperado de forma asíncrona, como una promesa, una devolución de llamada o un evento. Por lo tanto readAtlasAll()
, nunca puede devolver su valor directamente.
Consulte Cómo devolver la respuesta de una llamada asincrónica para obtener más información al respecto.
No hay comentarios.:
Publicar un comentario