Javascript 需要将异步数据库对象构造为父对象的属性
我有一个用户对象,它在构造函数中创建了一个mongoose数据库对象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 = 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);
});