簡體   English   中英

Node.js 和 MySQL。 Promise 內的 forEach() - 最后一項未插入數組

[英]Node.js and MySQL. forEach() inside Promise - last item is not being inserted in array

我在將查詢的最后一個元素推入數組時遇到問題。

  • 程序應遍歷testArray並在數據庫中搜索相應的MedikamentId
  • 然后創建一個包含這些 ID 的數組。

這幾乎可以工作,output 目前看起來像這樣: [3,2,3,2,3,2,3,2,3,2,3,2,3]

但是最后一個元素不見了,這個數組的末尾也應該有一個2 (總共必須有14個元素)。

當我運行在循環內注釋的console.log(medIdArray)時,我得到了正確的數組。

為什么當我將medIdArray放入 .then .then()處理程序時沒有返回我的最后一項?

 let testArray = [ ['Pantoprazol','Ibuprofen'], ['Pantoprazol','Ibuprofen'], ['Pantoprazol','Ibuprofen'], ['Pantoprazol','Ibuprofen'], ['Pantoprazol','Ibuprofen'], ['Pantoprazol','Ibuprofen'], ['Pantoprazol','Ibuprofen'], ]; let medIdArray = []; let sqlGetMedId = "SELECT MedikamentId FROM Medikament WHERE Bezeichnung =?"; let getMedId = new Promise((resolve, reject) => { testArray.forEach((i, idx, array) => { i.forEach((j) => { mySqlConnection.query(sqlGetMedId, j, (err, rows, fields) => { if (err) reject(err); medIdArray.push(rows[0].MedikamentId); //console.log(medIdArray); if (idx === array.length-1) resolve(); }) }) }) }) getMedId.then(() => { console.log(medIdArray); }) getMedId.catch((err) => { console.log(err); })

這行代碼

if (idx === array.length-1) resolve();

在內部循環的第一次迭代而不是第二次迭代中解析 promise。 利用

i.forEach((j, idx2) => {
   ...
   if (idx === array.length-1 && idx2 === i.length -1) resolve();
}

或類似的東西...

編輯

但不是嵌套循環,您可能可以先展平您的輸入數組,然后迭代展平的數組

let testArray = [[..], [..]];
let flattened = testArray.reduce((a, c) => {
  a.push(...c);
  return a;
}, [])

return new Promise((resolve, reject) => {
   flattened.forEach((elem, idx) => {
     con.query(..., (err, rows, fields) => {
       ...
       if (idx === flattened.length - 1) resolve();
     });
   });
});

或者你也可以使用Promise.all

let getIds = Promise.all(flattened.map(med => new Promise((res, rej) => { 
  conn.query(..., med, (err, rows, fields) => {
    if (err) rej(err);
    res(rows[0].MedikamentId);
  });
})));

getIds.then(data => {
  //data is an array of query results 
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM