0

mongojs クエリから配列を返すにはどうすればよいですか。ローカルで実行されている mongodb データベースに対して、nodejs を使用して以下のクエリを実行しました。Mongojs がトランザクションを処理しています。私の質問は; 以下の関数呼び出しから配列を返すにはどうすればよいですか。

    var databaseUrl = "users";
    var collections = ["users","reports"]; 
    var db = require('mongojs').connect(databaseUrl, collections );

    function usernameFromId(callback){
      db.users.find({}, function(err, result) {
        if(err || !result) console.log("Error");
          else{
           callback(result);
          }
      });
     };


    var x = usernameFromId(function(user){
    return user;
    });

    console.log(x);

ここで x は未定義です。x が x.name、x.email などで要素にアクセスできる配列になるような戻り値を作成するにはどうすればよいですか?

これは、データベースに保持されているものです。

 { "_id" : ObjectId("4fb934a75e189ff2422855be"), "name" : "john", 
 "password":"abcdefg", "email" : "john@example.com" }
 { "_id" : ObjectId("4fb934bf5e189ff2422855bf"), "name" : "james", 
 "password" :"123456", "email" : "james@example.com" }
4

1 に答える 1

2

return非同期関数を有効に使用することはできません。コールバック内で結果を処理する必要があります。

usernameFromId(function(user){
    console.log(user);
});

これは、非同期プログラミングの性質によるものです。「すぐに終了し、将来呼び出されるコールバック関数を設定します。」これは、次のことを意味します。

var x = usernameFromId(...);

コールバックが実際に呼び出される前に、全体が評価されます(から返される値xへの設定を含む)。undefinedusernameFromId

function (user) {
    return user;
}

そして、少なくともECMAScript 5の現在の標準では、これを回避することはできません。JavaScriptはシングルスレッドであるため、コールバックを待機しようとすると、シングルスレッドのみがロックされ、コールバックとreturn user永久にイベントキューで保留になります。

于 2012-05-20T18:38:24.490 に答える