es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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);
Tags:  , , ,

Answer

  1. Avatar for 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ón console.log está fuera del bucle forEach y todas las consultas de Sequelize son asíncronas (debido al uso de async-await), la declaración console.log se está ejecutando antes de que las consultas hayan terminado de ejecutarse y de poblar el array.

    Para solucionar esto, puedes envolver todo el bucle forEach en una función async y usar Promise.all para esperar a que todas las consultas asíncronas terminen antes de registrar el array en la consola. Aquí tienes un ejemplo de cómo puedes modificar el código:

    let array = [];
    
    async function executeQueries() {
      for (const element of data) {
        const techs = SelectedTech.findAll({ where: { Requirement_id: element } });
        const domains = SelectedDomains.findAll({ where: { Requirement_id: element } });
        const roles = SelectedRoles.findAll({ where: { Requirement_id: element } });
        const qualifications = SelectedQualifications.findAll({ where: { Requirement_id: element } });
    
        const [techResults, domainResults, roleResults, qualificationResults] = await Promise.all([techs, domains, roles, qualifications]);
    
        array.push(techResults, domainResults, roleResults, qualificationResults);
      }
    
      console.log(array);
    }
    
    executeQueries();
    

    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 el array. Finalmente, registramos el array en la consola después de que todas las consultas hayan terminado de ejecutarse.

Comments are closed.