1

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

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

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

4

2 回答 2

2

您给该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
});
于 2013-02-10T16:17:10.537 回答
0

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

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){ 
    .....
    }
});
于 2013-02-10T16:18:55.063 回答