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!
No puede usar await y una simple devolución de llamada en las llamadas a la API de MongoDB, ya que await 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 devolverán una promesa, por lo tanto, la 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 ningún poder mágico. TODO lo que hace es suspender la ejecución de la función hasta que se resuelva/rechace una promesa. Por lo tanto, solo hace algo útil cuando await una promesa.
Y, además, TODAS las funciones async 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. Entonces 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.