[英]Node.js and MySQL. forEach() inside Promise - last item is not being inserted in array
我在将查询的最后一个元素推入数组时遇到问题。
testArray
并在数据库中搜索相应的MedikamentId
这几乎可以工作,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.