JavaScript范围。 如何从callback函数中检索信息? 节点的MySQL

我是一个新手在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(); } 

然后我意识到那里有一个范围问题,经过一番研究,我试图模拟一个像这样的静态variables:

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

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

您给回queryfunction,因为它不会立即执行。

在刚刚调用connection.query之后的那一行,callback函数尚未运行。

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

 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是asynchronous的,因此您需要通过调用函数来更改函数和代码。 你应该在“callback”中思考,并理解在这种情况下不能使用回报。 当你查询时,它不会立即执行。 它只是注册一个callback,当MySQL服务器响应你的应用程序,只有那个callback被调用。 例:

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