对于循环内节点请求,不按预期执行

我是新来的节点,我正在努力与这里发生的事情:

app.get('/set_users/', function(req, res){ var users = [ { email: "tom@gmail.com", }, { email: "jon@gmail.com", } ]; for(i=0; i<users.length; i++){ console.log("Logging index"); console.log(i); User.findOne({email: users[i].email}, function(err, user){ console.log("Printing index"); console.log(i); if (err){ //Do something with error; } if (user) { //User already exists - do something } else{ //Add new user } } }); 

我期望console.log语句的输出是:

 logging index 0 logging index 1 Printing index 0 Printing index 1 

但是,我得到:

 logging index 0 logging index 1 Printing index 2 Printing index 2 

任何人有什么想法这里发生了什么?

       

网上收集的解决方案 "对于循环内节点请求,不按预期执行"

使用这个答案的帮助: https : //stackoverflow.com/a/16879859/1493564

我提出的答案是这样的:

 app.get('/set_users/', function(req, res){ var users = [ { email: "tom@gmail.com", }, { email: "jon@gmail.com", } ]; for(i=0; i<users.length; i++){ console.log("Logging index"); console.log(i); (function(i){ User.findOne({email: users[i].email}, function(err, user){ console.log("Printing index"); console.log(i); if (err){ //Do something with error; } if (user) { //User already exists - do something } else{ //Add new user } })(i) } }); 

不知道有没有人知道更好的解决scheme?

您需要确保callback中使用的variables不会被其他迭代所改变:

 for(i=0; i<users.length; i++){ var currentUserIndex = i; User.findOne({email: users[i].email}, function(err, user){ console.log("Printing index"); console.log(currentUserIndex); }); } 

你正在传递一个callback函数给User.findOne,它在你的for循环完成之后被触发(值为2)。 User.findOne是一个asynchronous函数,所以它会在完成时触发callback。