Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 需要将异步数据库对象构造为父对象的属性_Javascript_Node.js_Asynchronous_Constructor_Mongoose - Fatal编程技术网

Javascript 需要将异步数据库对象构造为父对象的属性

Javascript 需要将异步数据库对象构造为父对象的属性,javascript,node.js,asynchronous,constructor,mongoose,Javascript,Node.js,Asynchronous,Constructor,Mongoose,我有一个用户对象,它在构造函数中创建了一个mongoose数据库对象 mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/Data'); var db = mongoose.connection; UserSchema = new mongoose.Schema({ username: String, salt: String, hash: String, }); UserDB =

我有一个用户对象,它在构造函数中创建了一个mongoose数据库对象

mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/Data');
var db = mongoose.connection;

UserSchema = new mongoose.Schema({
    username: String,
    salt: String,
    hash: String,
});
UserDB = mongoose.model('users', UserSchema);

function User(id) {
    var self = this;
    if (id)
        UserDB.findById(id, function(err, user) { // async
            if (!err && user)
                self.db = user;
        });
}
但是,当我创建一个用户对象时,它的UserDB不会立即创建,因为它是一个异步数据库调用

user = new User('53179fd401d540b8c5000001');

if (user.db)
    console.log('fail '+user.db.id); // fails because !user.db yet
else
    setTimeout(function() {
        if (user.db)
            console.log('pass '+user.db.id); // only now it works
    }, 1000);

我该怎么做才能使构造函数不返回,除非创建了DB对象,或者其他不能让我执行不可靠的setTimeout的操作?

您可以防止这种情况发生

事实上,您的数据库是异步实例化的,正如您所说的那样

V1:您可以将回调传递给用户构造函数参数

function User(id, ready) {
    var self = this;
    if (id)
        UserDB.findById(id, function(err, user) { // async
            if (!err && user)
                self.db = user;

            if(ready !== undefined)
                ready.call(this);
        });
}


new User(1, function() {
    console.log(this); // <- your users instance
});
V2:否则,您需要一个用户-生产者-消费者模式上的eventqueue,该模式在所有内容都实例化之后被调度

V3:使用JQuery事件,然后调用$.when方法收集多个回调


v4:编写自己的回调队列以同步回调。

我想我会使用承诺

var when = require('when');
function User(id) {
    var d = when.defer();
    this.ready = d.promise;

    var self = this;
    if (id)
        UserDB.findById(id, function(err, user) { // async
            if (!err && user){
                self.db = user;
                d.resolve();
}       }); }

user = new User('53179fd401d540b8c5000001');
user.ready.then(function(){
    console.log(user.db.id);
});