对于循环内节点请求,不按预期执行
我是新来的节点,我正在努力与这里发生的事情:
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。