节点js数组值访问问题

时间:2018-04-21 08:26:52

标签: mysql node.js

我有数组,我想将查询结果存储在下面的数组中是代码

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);

它显示[]我想要存储的结果。

5 个答案:

答案 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)

尝试实施Promise here

console.log

在查询函数回调之前触发

答案 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();

我已经检查了上面的代码并且工作正常,感谢大家的快速支持。