这个问题在这里已有答案:
我正在使用此查询从products
表中选择所有记录,我想将它们存储在一个对象变量中,以后我可以将它用于其他目的,所以我尝试了这个
var SelectQuery = "Select * FROM `products`";
var ProductDetails = {};
conn.query(SelectQuery, function (err, result) {
if(err) {
console.log(err);
} else {
ProductDetails = result;
}
});
console.log(ProductDetails);
但在控制台我得到这个{}
。
(感谢用户jfriend00在我的原始答案中指出了一个主要的疏忽)
如果conn.query
返回promise,那么你可以通过使用async
/await
以你描述的方式完成这项工作:
async function getProducts() {
var SelectQuery = "Select * FROM `products`";
var ProductDetails = {};
await conn.query(SelectQuery, function(err, result) {
if (err) {
console.log(err);
} else {
ProductDetails = result;
}
});
console.log(ProductDetails);
}
但请注意,只有当你的conn.query
返回一个承诺时,这才有效。此外,它是一个较新的ES功能,因此您可能需要根据节点版本进行转换。另外,请注意,发生的功能需要用async
包装。
否则,其他用于处理异步性的候选人是callback functions和Promises。
如果conn.query
没有返回一个promise,你可以编写自己的查询实现来返回一个promise,这样你就可以利用async
/ await
:
function asyncQuery(sqlQuery) {
return new Promise((resolve, reject) => {
conn.query(SelectQuery, function(err, result) {
if (err) {
reject(err);
} else {
resolve(result);
}
})
})
}
然后原始函数可以重写为:
async function getProducts() {
var SelectQuery = "Select * FROM `products`";
var ProductDetails = await asyncQuery(SelectQuery);
console.log(ProductDetails);
}