Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

140
Vistas
renderizar la página después de que finalice el bucle for node.js

Tengo un problema asíncrono y he seguido muchos artículos en línea para tratar de solucionar este problema, pero no ha funcionado.

 async function getNumOfSessionForTrainerClientList(req, res, rows, allowedToAddMoreClients, alertMessage) { let sessionData2 = [] var getNumOfSessionForTrainerClientList = "select * from SCHEDULE WHERE CLIENT_USERNAME = ? AND ASSIGNED_TRAINER = ?" mysqlconn.connect(async function(err) {  if (err) {    console.error('Database connection failed: ' + err.stack);    return;  } for (var i = 0; i < rows.length; i++) { mysqlconn.query(getNumOfSessionForTrainerClientList, [rows[i].USERNAME, req.session.username], async function(err, sessionData) { if (err) { console.log(err); } else { for (var x = 0; x < sessionData.length; x++) { sessionData2.push(sessionData[x].SESSION_STATUS) console.log(sessionData2) } } }) } }) await res.render('trainerclientlist.ejs', {data: rows, trainerFirstName: req.session.firstname, trainerLastName: req.session.lastname, allowedToAddMoreClients: allowedToAddMoreClients, profilePhoto: req.session.profilePhoto, alertMessage: req.session.selectedalertmessage, sessionData: sessionData2}) console.log(sessionData2) }

lo que sucede es que console.log(sessionData2) sucede DESPUÉS de que se representa la página, await res.render('trainerclientlist.ejs', {data: rows, trainerFirstName: req.session.firstname, trainerLastName: req.session.lastname, allowedToAddMoreClients: allowedToAddMoreClients, profilePhoto: req.session.profilePhoto, alertMessage: req.session.selectedalertmessage, sessionData: sessionData2}) . ¿Cómo puedo arreglar esto?

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

 for (var i = 0; i < rows.length; i++) { // I'd avoid this line // This will force query x-amount of times, mysqlconn.query(getNumOfSessionForTrainerClientList, [rows[i].USERNAME, req.session.username], async function(err, sessionData) { if (err) { console.log(err); } else { // this could had been returned 200ms ->5s from when it's called for (var x = 0; x < sessionData.length; x++) { sessionData2.push(sessionData[x].SESSION_STATUS) console.log(sessionData2) } // I'd make your res.render call here or call for the next query till all are finished and when none left, now call res.render here... } }) } // probably took 1-20ms to complete the loop and so sessionData2 is not ready.. console.log(sessionData);
El problema que veo es que ejecuta un ciclo alrededor de una llamada de consulta, que no espera cada devolución de llamada, sino que activa cada consulta y en algún momento en el futuro se recibe la devolución de llamada. Dado que esto sucede demasiado rápido, puede imaginar que el servidor MySQL respondió con un retraso y fue eso exactamente lo que hace que sessionData no esté definido. Si coloca un setTimeout de 5 segundos, debe definirse porque se dio suficiente tiempo (pero no haga esto ... mala idea).

La mayor solución que puede hacer es configurar esto para que no tenga que recorrer filas.longitud... luego puede simplemente ejecutar res.render cuando MySQL responda.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda