本质上,我有一个带有字符串键和值的对象(例如{"michigan":"minnesota"}),. I试图遍历所有这些键值对并从数据库中进行查询,然后将结果添加到列表中,然后将返回到前端。
var return_list = []
Object.keys(obj).forEach(function(key){
const state1 = key;
const state2 = obj[key];
const sql_select = 'SELECT column1,column2 from database WHERE state = ? OR state=?';
db.query(sql_select,[state1,state2], (err,result) => {
return_list.push(result);
});
})
用最简单的话来说,这就是我想要的,并且希望将return_list发送回前端。我遇到的问题是我可以在db.query调用中console.log结果,但是我不能将结果推送到列表或在查询之外的任何地方调用它。我对前端和后端开发都还很陌生,因此任何可能的想法肯定会有所帮助!
分析解答
问题是forEach
返回void。
因此,您不能等异步代码运行后再返回。
当我们处理一系列承诺时,例如db查询(如您的案例)或API调用,我们应该等待它们中的每一个都被执行。
那就是我们使用Promise.all的时候
尝试这样做:
const queryResults = await Promise.all(
Object.keys(obj).map(async (key) => {
const state1 = key;
const state2 = obj[key];
const sql_select = 'SELECT column1,column2 from database WHERE state = ? OR state=?';
return new Promise((resolve, reject) =>
db.query(sql_select,[state1,state2], (err, result) => {
if (err)
return reject(err)
else
return resolve(result)
})
)
})
)
console.log('queryResults', queryResults)
// now you give this queryResults back to your FE
重新开始的小技巧:
- 永远不要使用var,请尝试始终使用const;如果需要,请让。
- 尝试始终使用箭头功能(
() => {...}
)而不是常规函数(function () {...}
),很难预测最后一个正在使用哪个范围