javascript - 从Nodejs中的异步函数返回值

标签 javascript node.js asynchronous mongoose return-value

我正在使用 nodejs 通过 Mongoose 从 Mongodb 查询数据。 获取数据后,我想在响应客户端之前对该数据做一些事情。但是我无法获得返回值。在谷歌后,我了解到 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');

最佳答案

您获得未定义值的原因是因为查找函数是异步的,并且可以随时完成。在您的例子中,它在您使用 console.log() 后完成,因此当您访问它们时这些值是未定义的。

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

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
  });
});

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

关于javascript - 从Nodejs中的异步函数返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18950984/

相关文章:

使用 TLS 的 node.js mqtt 客户端

javascript - Ember.js - 如何将模型类的属性绑定(bind)到 Controller ?

javascript - spry菜单占据了整个页面的高度

javascript - 在 Swiper slider 上的模式单击中设置事件幻灯片

javascript - html JavaScript 在新页面加载时不显示图像

mysql - 查询返回 BIT 数据类型的嵌套对象。如何获取位值?

javascript - 为什么不执行此循环?

javascript - 数组递增 Javascript/node js/mongodb

python - 如何制作一组既可以同步又可以异步使用的函数?

c# - Azure downloadtostreamasync 方法挂起