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

MongoDB in loop get skipped (Node.js)

本文关键字:Node js MongoDB 循环      更新时间:2023-09-26

很抱歉问noob问题(以下代码与express框架和mongoose DB相关)

我试图循环遍历包含用户名的数组"Users",然后尝试在猫鼬数据库中匹配它们,以获得每个用户的学校和分数。然后将它们组合到名为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 );

控制台应该打印[[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();
        }
    });
}

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