Javascript范围.如何从回调函数中检索信息?节点mysql

Javascript scope. How to retrieve information from a callback function? Node-mysql

本文关键字:信息 检索 节点 mysql 函数 范围 回调 Javascript      更新时间:2023-09-26

我是Javascript的新手,我试图制作一个函数来返回我从数据库中获得的iten数组。首先我尝试了这个:

function getItens(userId){
    var arr = new Array;
    var result;
    var connection = mysql.createConnection({
      host     : 'localhost',
      user     : 'XXXXXX',
      password : 'XXXXXX',
      database : 'XXXXXX',
    });
    connection.connect();
    connection.query('SELECT * from itens where userId = '+ userId function(err, rows, fields){
         if (err) throw err;
         arr = rows.slice()
    });
    return arr;
    connection.end();
}

然后我意识到存在范围问题,经过一些研究,我试图模拟一个静态变量,如

function getItens(userId){
  (function (){
      var resultado;
      Result = function(valor) { resultado = valor; }; 
      Result.prototype.getResultado = function (){return resultado};
      Result.prototype.setResultado = function (valor){ resultado = valor; };
  })();
  var ar = new Result([]);

  var connection = mysql.createConnection({
      host     : 'localhost',
      user     : 'XXXXXX',
      password : 'XXXXXX',
      database : 'XXXXXX',
    });
  connection.connect();
  connection.query('SELECT * from itens where userId = '+ userId , function(err, rows, fields){
        if (err) throw err;
        ar.setResultado(rows.slice());
  });
  return ar.getResultado();
  connection.end();
}

但它没有起作用,我做错了什么?

您给query函数一个回调,因为它不会立即执行。

在调用connection.query之后的行中,回调尚未运行。

您必须在您提供的回调中使用数据。请注意,一种常见的模式是为查询函数提供回调:

function fetchItens(userId, callback){
    var arr = new Array;
    var result;
    var connection = mysql.createConnection({
      host     : 'localhost',
      user     : 'XXXXXX',
      password : 'XXXXXX',
      database : 'XXXXXX',
    });
    connection.connect();
    connection.query('SELECT * from itens where userId = '+ userId function(err, rows, fields){
         if (err) throw err;
         arr = rows.slice()
         callback(arr);
    });
    connection.end();
}
fetchItens(someId, function(arr){
   // use arr
});

由于NodeJS中的大多数I/O都是异步的,因此需要通过调用函数来更改函数和使用的代码。您应该考虑"回调",并理解在这种情况下不能使用return。查询时,不会立即执行。它只是注册一个回调,当MySQL Server响应您的应用程序时,只有在那时才会调用该回调。示例:

function getItems(userid, callback){
   connection.connect();
   connection.query("SELECET .....", function(err,rows,fields){
       callback(rows.slice());
   }
}
var userid = 5;
getItems(userid, function(items){
    for(var i in items){ 
    .....
    }
});