「不過,如果我登錄,一旦功能已經完成,...」
通過這個我假設你正在做這樣的事情...
var user = new User
user.populate();
console.log(user);
如果是這樣,console.log
將在異步回調到.findOne()
被調用之前很長時間運行。
需要在回調中調用依賴於對findOne
的響應的任何代碼。
編輯:你的更新是從上面我舉的例子有點不同,但道理是一樣的。
將回調傳遞給findOne
方法的全部原因是它會執行異步活動。如果沒有,這個回調沒有任何理由。您只需在撥打findOne
之後直接放置內部代碼,就像您使用console.log()
一樣。
但是因爲它是異步,後續代碼不會等待執行。這就是爲什麼你要在控制檯中獲取未填充的對象。
如果您爲每個console.log()
添加一個標籤,您會發現它們的執行順序不正確。
var that = this;
db.collection("Users").findOne({email : that.email}, function(err, doc){
if(!err) {
that.firstName = doc.firstName;
that.lastName = doc.lastName;
that.password = doc.password;
}
console.log("inside the callback", that); // this happens Last!!!
});
console.log("outside the callback", that); // this happens First!!!
所以很清楚,一旦你觀察員console.log
的順序調用空單的回調裏面的人之前發生的事情。
編輯:你也可以有你的.populate()
方法會收到.findOne
回調內部調用的回調。
User.prototype.createNickName = function() {
this.nickname = this.firstName.slice(0,3) + '_' + this.lastName.slice(0,3);
};
// >>>------------------------------v----receive a function argument...
User.prototype.populate = function(callback_func) {
var that = this;
db.collection("Users").findOne({email : that.email}, function(err, doc){
if(!err) {
that.firstName = doc.firstName;
that.lastName = doc.lastName;
that.password = doc.password;
}
// all users will have the "createNickName()" method invoked
that.createNickName();
// ...and invoke it in the callback.
callback_func.call(that);
// By using .call(), I'm setting the "this" value
// of callback_func to whatever is passed as the first argument
});
};
// this user wants to log the firstName property in all caps
var user1 = new User;
user1.populate(function() {
console.log(this.firstName.toUpperCase());
});
// this user wants to log the the whole name
var user2 = new User;
user2.populate(function() {
console.log(this.firstName + ' ' + this.lastName);
});
// this user wants to verify that the password is sufficiently secure
var user3 = new User;
user3.populate(function() {
console.log(verify_password(this.password));
});
這是正確的。雖然這發生在外部調用user.populate()以及populate()方法本身內(但不在findOne()的範圍內)。我已更新帖子以反映我的意思。 – DuxPrime 2012-04-14 01:33:59
@ user574930:刷新瀏覽器。我已經更新了我的答案。 – 2012-04-14 01:34:50
有了這些知識,那麼我將如何能夠實現我正在尋找的效果,我可以簡單地調用populate()方法並知道對象的屬性將得到更新? – DuxPrime 2012-04-14 01:37:48