0

如何从 mongojs 查询返回数组。我使用 nodejs 将以下查询执行到本地运行的 mongodb 数据库中。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(...);

在实际调用回调之前,对其整体进行评估(包括设置为从 返回xundefinedusernameFromId):

function (user) {
    return user;
}

而且,至少对于ECMAScript 5的当前标准,您无法解决这个问题。由于 JavaScript 是单线程的,任何等待回调的尝试只会锁定单线程,将回调和return user永远挂起的事件保留在事件队列中。

于 2012-05-20T18:38:24.490 回答