0

抱歉问菜鸟问题(以下代码与 express 框架和 mongoose DB 相关联)

我正在尝试遍历包含用户名的数组“用户”,然后尝试在 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 );

控制台应该打印[[peter, MIT, 95], [john, Royal Academy, 89]],但是,控制台仍然打印[],变量 UsersInfoFinal 没有被修改。

这是为什么?有没有办法在循环后修改变量?请帮助我对node.js和MongoDB真的很陌生并且已经卡了几个小时:S

谢谢!

4

1 回答 1

1

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

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 环境中管理多个异步调用的一种非常常见的模式。可能有更好的方法来做到这一点,但它肯定能完成工作。

于 2013-08-15T05:35:58.547 回答