Javascript作用域。如何从回调函数中检索信息?节点mysql
我是Javascript的新手,我试图创建一个函数来返回我从数据库中获得的ITEN数组。首先,我尝试了这个:Javascript作用域。如何从回调函数中检索信息?节点mysql,javascript,node.js,node-mysql,Javascript,Node.js,Node Mysql,我是Javascript的新手,我试图创建一个函数来返回我从数据库中获得的ITEN数组。首先,我尝试了这个: function getItens(userId){ var arr = new Array; var result; var connection = mysql.createConnection({ host : 'localhost', user : 'XXXXXX', password : 'XXXXX
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();
}
但它不起作用,我做错了什么 您会回调
查询
函数,因为它不会立即执行
在调用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服务器响应您的应用程序时,才调用该回调。例如:
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){
.....
}
});
可能重复的