Node.js 和 SQL:如何在 for 循环之外获取值?

Node.js and SQL: How can I get the value outside of the for loop?

使用 Node.js 和 MySQL 数据库我正在做一个小项目。

我正在尝试遍历数组以从 MySQL 数据库中获取一些值。我正在搜索用户输入的“药物名称”对应的“药物 ID”。我的代码运行正常,这就是它的外观。

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);

代码有效,但我无法从 for 循环中获取 medizinArray。在我的控制台中,我得到一个空数组。当我将 console.log(medizinArray) 放在 for 循环中时,我得到了我想要的数组。

我目前不熟悉 Promises。我阅读了它并看到了一些其他问题,但我无法弄清楚如何在我的代码中实现 Promises。

SQL 操作是异步的,因此要在回调之外获取结果,您需要将它们包装在 Promise 中,并在操作成功时调用 resolve() 函数。使用以下任一技巧:

Async/await 技巧:

(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)});

Promise/then技巧:

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);
});