使用mongoose.find()方法在构造函数中设置javascript对象属性

使用mongoose.find()方法在构造函数中设置javascript对象属性,javascript,node.js,mongodb,asynchronous,mongoose,Javascript,Node.js,Mongodb,Asynchronous,Mongoose,我试图设置为使用mongoose查询中返回的文档设置Flight对象的\u docs属性,然后基于\u docs属性定义另外两个属性,但我无法这样做,因为它是异步发生的。我尝试过回调、承诺和npm异步,但都没有成功 我对JavaScript比较陌生,在正确理解异步概念方面有一些问题。我正在使用node.js 以下是我想做的: var mongoose = require('mongoose'); mongoose.connect('mongodb://*******:******@localho

我试图设置为使用mongoose查询中返回的文档设置
Flight
对象的
\u docs
属性,然后基于
\u docs
属性定义另外两个属性,但我无法这样做,因为它是异步发生的。我尝试过回调、承诺和npm异步,但都没有成功

我对JavaScript比较陌生,在正确理解异步概念方面有一些问题。我正在使用node.js

以下是我想做的:

var mongoose = require('mongoose');
mongoose.connect('mongodb://*******:******@localhost:27017/monitoring');
var db = monk('localhost:27017/monitoring', {username: '********',password: '*******'});
var VolDoc = require('./model/voldoc.js');


var Flight = function(flightId) {
    this._flightId = flightId;
    this._docs = VolDoc.find({_id: flightId}, {}, function(e, docs) {
        return docs; //this._docs should be the same than docs!
        //here or outside of the query i want do define a BEGIN and END property of the Flight Object like this : 
        //this._BEGIN = docs[0].BEGIN;    
        //this refers to the wrong object!
        //this._END = docs[0].END;
    });
    //or here :  this._BEGIN = this._docs[0].BEGIN;
    //this._END = this._docs[0].END
};

var flight = new Flight('554b09abac8a88e0076dca51');
// console.log(flight) logs: {_flightId: '554b09abac8a88e0076dca51',
                             //_docs:
                             //and a long long mongoose object!!
                             }
我尝试了很多不同的方法。因此,当它不返回mongoose对象时,我只在对象中获得
flightId
,其余的
未定义
,因为程序在不等待查询完成的情况下继续运行

有谁能帮我解决这个问题吗

以下是我的建议:

require('async');

var Flight = function(flightId)
{
  this._flightId = flightId;
};

var flight = new Flight("qwertz");
async.series([
  function(callback){
    VolDoc.find({_id:self._flightId},{}, function(e, docs)
    {
      flight._docs = docs;
      flight._BEGIN = docs[0].BEGIN;    
      flight._END = docs[0].END;
      callback(e, 'one');
    });                                                        
  },
  function(callback){
    // do what you need flight._docs for.
    console.dir(flight._docs);
    callback(null, 'two');
  }
]);

在异步调用的情况下使用事件调度器和侦听器。我刚刚尝试了它,但在尝试console.log(flight.\u docs)时仍然存在异步性问题。我没有定义,因为查询需要一段时间,程序在不等待查询完成的情况下继续运行。我担心您的概念是错误的。响应式/异步编程的含义是,在等待(例如)从数据库读取的值时,事情会继续进行。如果您想将mongoose访问与程序的其他部分同步,则必须从Flight构造函数中调用VolDoc.find并同步它。您可以使用async或Kris Kowolskis Q Lib来支持您。我提供了我的答案。这是未经测试的代码。可能有错误。它应该给你一个提示。好的,非常感谢。它可以工作,但是没有办法直接在构造函数中定义所有属性吗?所以我只需要输入新的航班('qwertz'),我的对象就准备好了?不,没有,因为mongoose是异步的。对find方法的调用不会阻塞并等待数据可用。这就是为什么要提供一个所谓的回调函数,当数据可用时调用该函数。我不知道对mongodb的同步调用。