我在將查詢的最后一個元素推送到陣列中時遇到問題。
- 程式應該回圈
testArray并在資料庫中搜索相應的MedikamentId - 然后創建這些 ID 的陣列。
這幾乎可以作業,目前的輸出如下所示: [3,2,3,2,3,2,3,2,3,2,3,2,3]
但是最后一個元素丟失了,2這個陣列的末尾也應該有一個(總和必須有 14 個元素)。
當我運行console.log(medIdArray)回圈內注釋的 時,我得到了正確的陣列。
為什么當我把它medIdArray放在.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);
})
uj5u.com熱心網友回復:
這行代碼
if (idx === array.length-1) resolve();
在內部回圈的第一次迭代而不是第二次迭代時解決承諾。用
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
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/374099.html
