我正在使用此查询从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);
但是在控制台中我得到了{}
。
答案 0 :(得分:0)
(感谢用户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
不返回承诺,您可以编写自己的查询实现来返回承诺,以便您可以利用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);
}