Javascript 循环中的MongoDB被跳过(Node.js)

Javascript 循环中的MongoDB被跳过(Node.js),javascript,node.js,mongodb,express,mongoose,Javascript,Node.js,Mongodb,Express,Mongoose,很抱歉问noob问题(下面的代码与express framework和mongoose DB相关) 我尝试循环遍历包含用户名的数组“Users”,然后尝试在mongoose数据库中匹配它们,以获得每个用户的学校和分数。然后将它们合并到名为UsersInfoFinal的最终数组中 var Users = ['peter', 'john']; var UsersInfoFinal = []; for (i = 0; i < Users.length; i++){ userModel.

很抱歉问noob问题(下面的代码与express framework和mongoose DB相关)

我尝试循环遍历包含用户名的数组“Users”,然后尝试在mongoose数据库中匹配它们,以获得每个用户的学校和分数。然后将它们合并到名为UsersInfoFinal的最终数组中

var Users = ['peter', 'john'];
var UsersInfoFinal = [];

for (i = 0; i < Users.length; i++){
    userModel.findOne ({username: Users[i]}, 'username school grade', function (error, UserInfo) {
        UsersInfoFinal .push([UserInfo.username, UserInfo.school, UserInfo.grade]);
    });
}
console.log(UsersInfoFinal );
var用户=['peter','john'];
var UsersInfoFinal=[];
对于(i=0;i
控制台应该打印
[[peter,MIT,95],[john,Royal Academy,89]]
,但是,控制台仍然打印
[]
,变量UsersInfoFinal没有修改


为什么呢?有没有办法在循环后修改变量?我对node.js和MongoDB还很陌生,已经被困了几个小时:S


谢谢

在这里,我将为您提供一个非常简单的模式,供您在此类情况下使用。请尝试以下代码:

var Users = ['peter', 'john'];
var UsersInfoFinal = [];

var usersWaiting = 0;

function allDone() {
  console.log(UsersInfoFinal);
}

for (i = 0; i < Users.length; i++){
    usersWaiting++;
    userModel.findOne ({username: Users[i]}, 'username school grade', function (error, UserInfo) {
        usersWaiting--;
        UsersInfoFinal .push([UserInfo.username, UserInfo.school, UserInfo.grade]);
        if (usersWaiting == 0) {
          allDone();
        }
    });
}
var用户=['peter','john'];
var UsersInfoFinal=[];
var usersWaiting=0;
函数allDone(){
console.log(UsersInfoFinal);
}
对于(i=0;i

这是在ecmascript环境中管理多个异步调用的一种非常常见的模式。可能有更好的方法,但它确实完成了任务。

>为什么?
--异步I/O。去读一些关于控制流的节点教程。有没有方法在循环后修改变量?因为我试图在之后将变量发送到其他地方<代码>响应。呈现(一些网页,用户sinfofinal)
有效!它有什么魔力?我的意思是,通常情况下,usersWaiting++和usersWaiting--相互取消..它们会相互取消。然而,诀窍在于代码没有按照您期望的顺序执行。顶级循环完全执行,然后执行所有回调。查看此以了解更多信息