Recibo los nombres de algunos animales en consulta separados por comas. Ahora tengo que llamar a una API que solo acepta un nombre de animal a la vez. Quiero llamar a la misma API una vez para cada animal y enviar los datos jsonificados en una matriz antes de responder a mi cliente.
Obtengo una matriz vacía en mi cliente durante la prueba y, según tengo entendido, eso sucede porque se ejecuta res.send () mientras la promesa espera ser resuelta.
Cualquier solución es muy apreciada.
router.get('/animals', async (req, res) => { const mammalsArray = req.query.mammals.split(','); let final = []; await mammalsArray.forEach(async function(mammal) { const response = await fetch(`https://someapi.com/pedia?tag=${mammal}`); const json = await response.json(); final.push(json); }); res.send(final); });La función async devuelve una promesa. Desea guardar todas las promesas y cuando se resuelven todas las promesas, desea continuar.
Puede esperar todas las promesas con Promise.all .
Usé map en lugar de forEach para asignar todos los valores de matriz a promesas.
router.get('/animals', async(req, res) => { const mammalsArray = req.query.mammals.split(','); let final = []; let promisesArray = mammalsArray.map(async function(mammal) { const response = await fetch(`https://someapi.com/pedia?tag=${mammal}`); const json = await response.json(); final.push(json); }); await Promise.all(promisesArray); res.send(final); });