Node.js 和 MySQL。 Promise 中的 forEach() - 最后一项未插入数组中
Node.js and MySQL. forEach() inside Promise - last item is not being inserted in array
我无法将查询的最后一个元素放入数组中。
- 程序应该遍历
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);
})
这行代码
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
});
我无法将查询的最后一个元素放入数组中。
- 程序应该遍历
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);
})
这行代码
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
});