3

necesito hacer varias peticiones a la base de datos segun la primera respuesta de un query pero al realizarlo con "promise" ejecuta la primera sentencia y salta al ultimo "then" y da la respuesta antes de terminar la ejecucion, por favor alguien que me pueda aydar.

pruebasModule.promesa = async (idc, callback) => {

  // console.log(id);
  var sql = 'SELECT * FROM historia_clinica WHERE historia_clinica.id_historiacl = ?;';
  var promise = new Promise(async function (res,rej){
    await connection.query(sql,idc,(err,data) => {
      // console.log(data);
      return (err) ? rej(err) :  res(data);
    })
  });
promise.then(async (res1,rej1)=> {
          console.log('resolve de antecedentes');
          res1 = res1[0];
          console.log(res1);
          console.log(res1.id_antecedentesf);
          if(res1.id_antecedentesf != null)
          {
            let sqlaf = 'SELECT * FROM prevenirexpres.antecedentes_f WHERE id_antecedentesf = ?;';
             await connection.query(sqlaf,[res1.id_antecedentesf],(err,respaf)=>{
                console.log(respaf);

                res1.antecedentesf = respaf;
                console.log('resp de query antecedentef');
                console.log(res1);
                return res1;

              })
            }
            else
            {
              console.log('resp de query antecedentef no existe');
              console.log(res1);
               return res1;

            }

          }).then(async (res2,rej2)=>{
                console.log('AFTER RES1');
          })

}

la respuesta que obtengo es esta para que miren y me ayuden muchas gracias.

24

resolve de antecedentes

RowDataPacket { id_historiacl: 24, tipo_consulta: 'primera vez',
motiv_oconsulta: 'dolor cabeza', enfermedades_preex: 'migraña',
id_historia_opt: null, id_antecedentesf: 22, id_antecedentesp: 18, id_habitosyfactores: 13, id_revisionpsistemas: 3, id_examenf: null, usuarios_id: 48, id_servicios: 42, createdAd: 2019-11-22T14:55:51.000Z }

22

AFTER RES1 Esta es la respuesta que deberia salir al final

[ RowDataPacket { id_antecedentesf: 22, cardiopatias: 1, diabetes: 1, hipertension: 1, asma: 0, enfermadad_psiquiatrica: 0, efisema: 0, cancer: 1, epilepcia: 0, otro: null } ] resp de query antecedentef

RowDataPacket { id_historiacl: 24, tipo_consulta: 'primera vez',
motiv_oconsulta: 'dolor cabeza', enfermedades_preex: 'migraña',
id_historia_opt: null, id_antecedentesf: 22, id_antecedentesp: 18, id_habitosyfactores: 13, id_revisionpsistemas: 3, id_examenf: null, usuarios_id: 48, id_servicios: 42, createdAd: 2019-11-22T14:55:51.000Z,
antecedentesf: [ RowDataPacket { id_antecedentesf: 22, cardiopatias: 1, diabetes: 1, hipertension: 1, asma: 0, enfermadad_psiquiatrica: 0, efisema: 0, cancer: 1, epilepcia: 0, otro: null } ] }

como se puede ver da la respuesta antes de ejecutar el segundo query con AFTER RES1 y despues realiza el segundo then en el que carga los antecedentes.

  • Hola, ¿puedes indicar qué librería estás usando? ¿[mysql](https://www.npmjs.com/package/mysql), [mysql2](https://www.npmjs.com/package/mysql2)? Asó podría darte una respuesta acertada. – Mauricio Contreras Dec 04 '19 at 19:49
  • hola estoy usando mysql let mysql = require('mysql'); – Juan Carlos Guzman E Dec 04 '19 at 20:14
  • Relacionado: [Consulto a mi base de datos en mysql desde nodejs, quiero obtener los resultados y guardarlos en una variable pero ¿porque no funciona?](https://es.stackoverflow.com/questions/308580/consulto-a-mi-base-de-datos-en-mysql-desde-nodejs-quiero-obtener-los-resultados) – Mauricio Contreras Dec 08 '19 at 13:54
  • logre solucionarlo colcando una nueva promesa dentro del then al cumplir la promesa anterior. se que no es la mejor solucion pero me funciono. – Juan Carlos Guzman E Dec 10 '19 at 14:26

1 Answers1

2

aqui agrego el codigo como logre la solucion si le sirve alguien o tiene el mismo problema

pruebasModule.promesa = async (idc, callback) => {
  // console.log(id);
  var sql = 'SELECT * FROM historia_clinica WHERE historia_clinica.id_historiacl = ?;';
  var sqlaf = 'SELECT * FROM antecedentes_f WHERE id_antecedentesf = ?;';
  var sqlap = 'SELECT * FROM antecedentes_p WHERE id_antecedentesp = ?;';
  var sqlop = 'SELECT * FROM historia_opt WHERE idhistoria_opt = ?';
  var promise = new Promise(async function (res,rej){
    await connection.query(sql,idc,(err,data) => {
      // console.log(data);
      return (err) ? rej(err) :  res(data);
    })
  });
  var promiseAf = new Promise(async function(resaf,rejaf){
      // await connection.query(sql,)
  });
promise.then(async(res1,rej1)=> {
            console.log(res1);
            new Promise(async function(resolve, reject) {
              res1 = res1[0];
                if(res1.id_antecedentesf != null)
                {
                  console.log('denrtro del if');
                  console.log(res1.id_antecedentesf);
                  connection.query(sqlaf,[res1.id_antecedentesf],(err,resaf)=>{
                    res1.antecedentef = resaf[0];
                    return (err) ? reject(err) :  resolve(res1);
                  })
                }
                  else{
                    res1.antecedentef = {};
                    return resolve(res1)
                  }
            }).then(async(res2,rej2)=>{
                      new Promise(function(resolve, reject) {
                        console.log('RES 2');
                              console.log(res2);
                              console.log(res2.id_antecedentesp);
                      if(res2.id_antecedentesp != null)
                      {
                        connection.query(sqlap,[res2.id_antecedentesp],(err,resap)=>{
                          console.log(resap);
                          res2.antecedentesp = resap[0];
                          return (err) ? reject(err) : resolve(res2);
                        })
                      }
                      else {
                        console.log('FUNCIONO');
                        res2.antecedentesp = {};
                        return resolve(res2)
                      }
                      }).then(async(res3,rej3)=>{
                              new Promise(function(resolve, reject) {
                                console.log('RES 3');
                                      console.log(res3);
                                      console.log(res3.id_historia_opt);
                                      if(res3.id_historia_opt != null)
                                        {
                                          connection.query(sqlop,[res3.id_historia_opt],(err,resop)=>{
                                            console.log(resop);
                                            res3.histoptica = resop[0];
                                            return (err) ? reject(err) : resolve(res3);
                                          })
                                        }
                                        else {
                                          console.log('NO OPTICA');
                                          res3.histoptica = {};
                                          return resolve(res3)
                                        }
                              }).then(async(res4,rej4)=>{
                                  new Promise(function(resolve, reject) {
                                          console.log('RES 4');
                                          console.log(res4);
                                          if(res4.id_habitosyfactores != null)
                                          {
                                            let sqlhyf = 'SELECT * FROM habitosyfactores WHERE id_habitosyfactores = ?;';
                                            connection.query(sqlhyf,[res4.id_habitosyfactores],(err,reshf)=>{
                                              res4.habitosyfactores = reshf[0];
                                              return (err) ? reject(err): resolve(res4);
                                            })
                                          }
                                          else
                                          {
                                            console.log('NO Habitos');
                                            res4.habitosyfactores = {};
                                            return resolve(res4)
                                          }

                                  }).then(async(res5,rej5)=>{
                                    new Promise(function(resolve, reject) {
                                      console.log('RES5');
                                      console.log(res5);
                                      if(res5.id_revisionpsistemas != null){
                                        let sqlrs = 'SELECT * FROM revisionpsistemas WHERE id_revisionpsistemas = ?;';
                                      }
                                      else{

                                      }
                                    }).then(async(resfn,rejfn)=>{
                                        console.log('then fin');
                                        console.log(resfn);
                                        callback(null,resfn)
                                    }).catch((err)=>{console.error(err);})
                                 });
                               });
                             });
                           });
                         });
}