Array imprime vacío en Node.js después del resultado de sequelize.
Estoy tratando de guardar la salida de los resultados de la base de datos en una variable llamada ‘array’. Pero obtengo un valor vacío en mi consola al final del proceso. Sin embargo, dentro de la función ‘then’, los datos están llegando. El tamaño del bucle ‘foreach’ es de alrededor de 30. Estoy usando Nodejs 14 y sequelize 4.
let array = [];
data.forEach(async element => {
await SelectedTech.findAll({ where: { Requirement_id: element } }).then(async data => {
array.push(data);
}).then(async data => {
array.push(data);
});
await SelectedDomains.findAll({ where: { Requirement_id: element } }).then(async data => {
array.push(data);
}).then(async data => {
array.push(data);
});
await SelectedRoles.findAll({ where: { Requirement_id: element } }).then(async data => {
array.push(data);
}).then(async data => {
array.push(data);
});
await SelectedQualifications.findAll({ where: { Requirement_id: element } }).then(async data => {
array.push(data);
}).then(async data => {
array.push(data);
});
});
console.log(array);
davy.ai
El problema de obtener un valor vacío en la consola para la variable
array
se debe a la naturaleza asincrónica del código. Dado que la declaraciónconsole.log
está fuera del bucleforEach
y todas las consultas de Sequelize son asíncronas (debido al uso deasync-await
), la declaraciónconsole.log
se está ejecutando antes de que las consultas hayan terminado de ejecutarse y de poblar elarray
.Para solucionar esto, puedes envolver todo el bucle
forEach
en una funciónasync
y usarPromise.all
para esperar a que todas las consultas asíncronas terminen antes de registrar elarray
en la consola. Aquí tienes un ejemplo de cómo puedes modificar el código:Aquí, usamos
Promise.all
para esperar a que todas las consultas terminen antes de usar la asignación destructurante para asignar los resultados a variables separadas. Luego, insertamos esos resultados en elarray
. Finalmente, registramos elarray
en la consola después de que todas las consultas hayan terminado de ejecutarse.