0

初心者の質問をして申し訳ありません(以下のコードは、エクスプレスフレームワークとマングースDBに関連付けられています)

ユーザー名を含む配列「ユーザー」をループしようとしています。次に、マングースデータベースでそれらを照合して、各ユーザーの学校と学年を取得しようとしています。次に、それらを組み合わせて、 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 に答える