Node.js与MySQL结合时Promise内forEach最后一项未插入数组问题
问题原因
- 你的
resolve()触发时机错误:testArray共7个元素,索引最后一位是6,对应子数组包含2个待查询的药品名称。当第一个药品的数据库查询返回、执行回调时,idx === array.length-1就会成立,直接触发resolve(),此时第二个药品的查询结果还没返回,自然没被push到数组里,所以最后一位缺失。 - 循环内
console.log(medIdArray)看起来正确是因为浏览器/Node.js的控制台打印引用类型时,展示的是你展开时的数组最新状态,不是打印那一刻的快照,你之后第二个查询完成push了值,控制台看到的就是更新后的完整数组,但then触发时第二个查询还没执行完,拿到的就是少一位的数组。
修复方案
把所有数据库查询包装成独立Promise,用Promise.all等待全部完成再返回结果,避免手动计数的错误:
let testArray = [ ['Pantoprazol','Ibuprofen'], ['Pantoprazol','Ibuprofen'], ['Pantoprazol','Ibuprofen'], ['Pantoprazol','Ibuprofen'], ['Pantoprazol','Ibuprofen'], ['Pantoprazol','Ibuprofen'], ['Pantoprazol','Ibuprofen'], ]; let sqlGetMedId = "SELECT MedikamentId FROM Medikament WHERE Bezeichnung = ?"; // 把所有查询任务平铺出来,每个包装成Promise const queryPromises = testArray.flat().map(medName => { return new Promise((resolve, reject) => { mySqlConnection.query(sqlGetMedId, medName, (err, rows) => { if(err) return reject(err); resolve(rows[0].MedikamentId); }) }) }) Promise.all(queryPromises) .then(medIdArray => { // 这里拿到的就是完整顺序的id数组 console.log(medIdArray); }) .catch(err => { console.log(err); })
内容的提问来源于stack exchange,提问作者durikr
相关产品推荐
相关产品推荐

