我正在for循环中执行一个mysql查询,这个循环是在回调函数中,但是当我执行console.log(i)时,它会向我显示三次。下面是代码。我正在使用async.parallel,我只发布有问题的代码。 res也返回正常,但obj显示第三条记录三次,而不是显示obj1数据,obj2数据,obj3数据。 console.log(i)是示例响应。
function(user,callback){
for(var i = 0; i < user.length ; i++) {
var obj = user[i];
mySQLConn.mySQLDBConnection.query('select id,name from table where type = ?',[obj.id],function(err,res){
console.log(i); //This shows 3 three times
obj.type = res;
userJSONArray.push(obj);
})
}
}
我想要它应该打印1,2,3而不是3,3,3。任何帮助都非常感谢。
答案 0 :(得分:1)
ES6:现在可以使用let
关键字解决此问题。
function(user, callback) {
for (let i = 0; i < user.length; i++) {
let obj = user[i];
mySQLConn.mySQLDBConnection.query('select id,name from table where type = ?', [obj.id], function(err, res) {
console.log(i); //This shows 3 three times
obj.type = res;
userJSONArray.push(obj);
})
}
}
实际上你的回调功能正常。
您的数据库查询很可能是异步的。这意味着,当您从数据库获取信息时,i
已经等于3。
答案 1 :(得分:0)
这是因为异步调用。当您的通话完成时i
中有3个......您可以执行以下操作:
for(var i = 0; i < user.length ; i++) {
var obj = user[i];
(function(i, obj)
{
mySQLConn.mySQLDBConnection.query('select id,name from table where type = ?',[obj.id],function(err,res){
console.log(i); //This shows 3 three times
obj.type = res;
userJSONArray.push(obj);
})
})(i, obj);
}