Usando Node.js y una base de datos MySQL, estoy trabajando en un pequeño proyecto.
Estoy tratando de recorrer una matriz para obtener algunos valores de una base de datos MySQL. Estoy buscando el "ID de medicamento" correspondiente a un "nombre de medicamento" que ingresó el usuario. Mi código funciona correctamente y así es como se ve.
var medizinArray = []; function appendArray(input) { medizinArray.push(input); } var sqlMedNameToId = "SELECT MedikamentId FROM Medikament WHERE Bezeichnung = ?" for (var i=0;i<medicineMontag.length;i++){ var montagsMedizin = medicineMontag[i]; mySqlConnection.query(sqlMedNameToId, montagsMedizin, function(err, rows, fields){ if(!err) { result = rows[0].MedikamentId; appendArray(result); } else { console.log(err); } }) } console.log(medizinArray);El código funciona, pero no puedo sacar el medizinArray del bucle for. En mi consola obtengo una matriz vacía. Cuando coloco el archivo console.log(medizinArray) dentro del bucle for, obtengo la matriz que quiero.
Actualmente no estoy familiarizado con Promises. Leí sobre esto y vi algunas otras preguntas, pero no puedo entender cómo implementar Promises en mi código.
Las operaciones de SQL son asíncronas, por lo que para obtener el resultado fuera de la devolución de llamada, debe envolverlas en una Promesa y llamar a la función resolve() cuando la operación sea exitosa. Utilice cualquiera de las siguientes técnicas:
Técnica asíncrona/espera:
(async function(){ let medizinArray = []; function appendArray(input) { medizinArray.push(input); } let sqlMedNameToId = "SELECT MedikamentId FROM Medikament WHERE Bezeichnung = ?" await new Promise(function(resolve, reject){ let e; for (let i=0;i<medicineMontag.length;i++){ let montagsMedizin = medicineMontag[i]; mySqlConnection.query(sqlMedNameToId, montagsMedizin, function(err, rows, fields){ if(e) return; if(!err) { result = rows[0].MedikamentId; appendArray(result); } else { //console.log(err); e = true; return reject(err); } if(i == medicineMontag.length-1) resolve(result); }) } } ); console.log(medizinArray);//now medizinArray shows up here })().catch(function(err){console.log(err)});Promesa/entonces técnica:
let medizinArray = []; function appendArray(input) { medizinArray.push(input); } let sqlMedNameToId = "SELECT MedikamentId FROM Medikament WHERE Bezeichnung = ?" new Promise(function(resolve, reject){ let e; for (let i=0;i<medicineMontag.length;i++){ let montagsMedizin = medicineMontag[i]; mySqlConnection.query(sqlMedNameToId, montagsMedizin, function(err, rows, fields){ if(e) return; if(!err) { result = rows[0].MedikamentId; appendArray(result); } else { console.log(err); e = true; return reject(err); } if(i == medicineMontag.length-1) resolve(result); }) } } ).then(function(result){ console.log(medizinArray);//now medizinArray shows up here }).catch(function(err){ console.log(err); });