GOOGLE ADS

sábado, 23 de abril de 2022

¿Cómo devolver una variable 'esperar' en JavaScript?

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 awaity una devolución de llamada simple en las llamadas a la API de MongoDB, ya awaitque 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 awaitesa 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 awaitno 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 awaituna promesa.

Y, además, TODAS asynclas 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

Flutter: error de rango al acceder a la respuesta JSON

Estoy accediendo a una respuesta JSON con la siguiente estructura. { "fullName": "FirstName LastName", "listings...