我有数组,我想将查询结果存储在下面的数组中是代码
var button_settings=[];
con.query("SELECT * from ht_button", function (err, result, fields){
if (err) throw err;
button_settings.push(result);
});
console.log(button_settings);
它显示[]我想要存储的结果。
答案 0 :(得分:1)
您正在查询本质上是异步的数据库,因此console.log
不会等待con.query
的结果并在此之后立即执行。因此,您会打印[]
。但是,如果在查询完成后您在result
中有记录,那么如果您将console.log(button_settings);
放在con.query
函数中,您将在控制台中打印数组:
将代码更改为
var button_settings=[];
con.query("SELECT * from ht_button", function (err, result, fields){
if (err) throw err;
button_settings.push(result);
console.log(button_settings); //console after the query completes
});
因此,要使流程像同步一样使用button_settings
的值,请创建一个这样的私有函数,
var button_settings=[];
con.query("SELECT * from ht_button", function (err, result, fields){
if (err) throw err;
button_settings.push(result);
_processButtonSettings();
});
//put all your code related to button_settings here
function _processButtonSettings(){
console.log(button_settings);
//and more code...
}
答案 1 :(得分:0)
connection.query是异步的,这意味着您的console.log(button_settings)
,button_settings
的呼叫尚未设置。
var button_settings=[];
con.query("SELECT * from ht_button", function (err, result, fields){
if (err) throw err;
else setValue(result);
});
function setValue(value) {
button_settings = value;
console.log(button_settings);
}
答案 2 :(得分:0)
答案 3 :(得分:0)
解决此问题的正确方法是在回调中编写console.log
。这是强烈推荐的。
现在来到你想要的部分,即在console.log
之后在同一个区块中写con.query
并且你也不希望console.log
处于单独的功能中(这就是我的意思)从问题和其他答案中的评论中理解)
要实现这一目标,您必须将con.query
包含在承诺中并使用await
等待承诺结算。
var button_settings=[];
await new Promise(function(resolve, reject){
con.query("SELECT * from ht_button", function (err, result, fields){
if (err) reject(err)
button_settings.push(result);
resolve()
});
}).catch(function(err){/* handle err */})
console.log(button_settings);
唯一的问题是你只能在await
函数中使用async
。因此,让我们在代码中包装一个async
函数
最终代码:
async function doStuff(){
var button_settings=[];
await new Promise(function(resolve, reject){
con.query("SELECT * from ht_button", function (err, result, fields){
if (err) reject(err)
button_settings.push(result);
resolve()
});
}).catch(function(err){/* handle err */})
console.log(button_settings);
}
doStuff();
我还没有用实际的mysql测试这段代码......但我这是一个等价的测试:
async function doStuff(){
var button_settings=[];
await new Promise(function(resolve, reject){
setTimeout(function(){
button_settings = ["foobar"];
resolve();
},1000)
});
console.log(button_settings);
}
doStuff();

答案 4 :(得分:0)
var res1=[];
var res2=[];
var res3=[];
async function doStuff(){
await new Promise(function(resolve, reject){
con.query("SELECT * FROM vm_admin", function (err, result, fields) {
if (err) throw err;
resolve();
res1.push(result);
});
});
await new Promise(function(resolve, reject){
con.query("SELECT * FROM vm_banks", function (err, result, fields) {
if (err) throw err;
resolve();
res2.push(result);
});
});
console.log(res1);
console.log('----------------');
console.log(res2);
}
doStuff();
我已经检查了上面的代码并且工作正常,感谢大家的快速支持。