Así que tengo el siguiente código en javascript
async function getFoodData (req, res) { const ids = req.body.data; const food = []; ids.map((id) => { Food.findOne({ _id: id },(err, result) => { if(result){ food.push(result) } }) }) return res.status(200).json({ Food: food }) }Los identificadores son un montón de identificadores de Mongo recibidos en el cuerpo. Esta función busca datos y, al devolver los resultados, los agrega a la matriz de alimentos. Sin embargo, la declaración de devolución se ejecuta primero y obtengo una matriz vacía. Creo que mi problema se resolverá usando Promises, pero soy nuevo en el concepto y, por lo tanto, ¿alguien puede ayudarme?
Puede utilizar await y Promise.all para lograrlo.
Promise.all() toma una serie de promesas. Ahora con la declaración, await Promise.all(foodPromises); estás esperando que todas las promesas se resuelvan.
Después de eso, puede filtrar la matriz de resultados solo para valores truthy , lo que estaba haciendo en su código.
async function getFoodData (req, res) { const ids = req.body.data; const food = []; const foodPromises = ids.map((id) => Food.findOne({ _id: id })); await Promise.all(foodPromises); let returnData = foodPromises.filter(x => x); return res.status(200).json({ Food: food }) } .map() generalmente se usa cuando desea transformar una matriz en otra. Si solo desea ejecutar un ciclo, use for / forEach() .
Después de algunas investigaciones, también encontré otra solución.
async function getFoodData (req, res) { const ids = req.body.data; const food = []; async function foodData(id) { const food = await Food.findOne({ _id: id }) if(food) return food } for( let i = 0; i < ids.length; i++ ) { const result = await foodData(ids[i]) if(result) food.push(result) } return res.status(200).json({ Food: food }) }Crear una función y luego usar await mientras el bucle hizo el trabajo por mí