node js数组值访问问题

noj0wjuj  于 2021-06-21  发布在  Mysql
关注(0)|答案(5)|浏览(342)

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

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

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

pftdvrlh

pftdvrlh1#

试着在这里履行诺言

console.log

在查询函数回调之前激发

whlutmcx

whlutmcx2#

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

我已经检查了上面的代码和它的工作良好,谢谢大家的快速支持。

23c0lvtd

23c0lvtd3#

查询的数据库本质上是异步的,因此 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...
}
7gcisfzg

7gcisfzg4#

解决这个问题的正确方法是写作 console.log 在回调中。这是我们极力推荐的。
现在来谈谈你想要的部分,即写作 console.log 之后 con.query 在同一个街区而且你不想 console.log 在单独的函数中(这是我从问题和你在其他答案中的评论中理解的)
要做到这一点,你必须 Package 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 功能。所以让我们用一个代码来 Package 整个过程 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();
ia2d9nvy

ia2d9nvy5#

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

相关问题