从Nodejs中的异步函数返回值

Vo *_*ang 2 javascript asynchronous return-value mongoose node.js

我正在使用nodejs来查询来自Mongodb的Mongodose数据.获取数据后,我想在响应客户端之前对该数据执行某些操作.但我无法获得回报价值.在Google上查看之后,我了解到Node.js函数是异步javascript函数(非I/O阻塞).我尝试这个tut(http://www.youtube.com/watch?v=xDW9bK-9pNY),但它不起作用.以下是我的代码.myObject在"find()"函数内部被赋值,在"find()"函数外部未定义.那么我该怎么做才能获得数据呢?谢谢!

var Person = mongoose.model('Person', PersonSchema);
var Product = mongoose.model('Product', ProductSchema);
var myObject = new Object();

Person.find().exec(function (err, docs) {
    for (var i=0;i<docs.length;i++)
    { 
    Product.find({ user: docs[i]._id},function (err, pers) {
    myObject[i] = pers;
    console.log(myObject[i]); //return the value is ok
    });
    console.log(myObject[i]); //return undefined value
    }
    console.log(myObject); //return undefined value
});
    console.log(myObject); //return undefined value

app.listen(3000);
console.log('Listening on port 3000');
Run Code Online (Sandbox Code Playgroud)

hex*_*ide 8

你得到未定义值的原因是因为find函数是异步的,并且可以随时完成.在您的情况下,它在您使用后完成console.log(),因此当您访问它们时,值是未定义的.

要解决此问题,您只能使用find函数回调中的值.它看起来像这样:

var Person = mongoose.model('Person', PersonSchema);
var Product = mongoose.model('Product', ProductSchema);
var myObject = new Object();

function getData(docs, callback) {
  function loop(i) {
    Product.find({ user: docs[i]._id}, function (err, pers) {
      myObject[i] = pers;

      if (i < docs.length) {
        loop(i + 1);
      } else {
        callback();
      }
    });
  };
  loop(0);
};

Person.find().exec(function(err, docs) {
  getData(docs, function() {
    // myObject has been populated at this point
  });
});
Run Code Online (Sandbox Code Playgroud)

数据处理已移至循环,等待上一次迭代完成.这样,我们可以确定最后一个回调被触发的时间,以便在包装函数中触发回调.