2016-09-07 121 views
0

這是一個普遍的問題,但爲什麼在貓鼬查詢功能,例如:Mongoose查詢回調返回?

var myFunc = function(username, callback){ 
    User.findOne({username: username}, 'username name, password', function(err, user){ 
     callback(user); 
    }); 
}; 

myFunc('somename', function(userInfo){ 
    console.log(userInfo); 
}); 

需要另一個函數返回的用戶?爲什麼我不能簡單地說:

var myFunc = function(username){ 
    User.findOne({username: username}, 'username name, password', function(err, user){ 
     return user; 
    }); 
}; 

var userInfo = myFunc('somename'); 
console.log(userInfo); 
+0

當你調用內部函數內部回報率,回報是具體到內部功能,而不是外部函數。也看看[這](http://stackoverflow.com/questions/6847697/how-to-return-value-from-an-asynchronous-callback-function)計算器交更多信息 –

回答

0

您正在使用異步操作,這意味着因爲沒有價值存在,你不能返回值工作當Node環境達到你的return語句時。

數據庫操作需要一定的時間,在這段時間內您的數據庫查詢代碼執行結束和節點是在當前調用堆棧或者整理代碼,工作就可以從節點事件隊列中獲得一個任務,或者閒置。

一旦你的分貝值返回,回調被放置在節點事件隊列準備由節點環境消耗並打印到控制檯。

如果有數據庫請求,數據庫 查找調用和返回的數據庫值之間存在另一個url請求,Node將設置一個工作線程來處理您的數據庫請求,另一個來處理數據庫操作。當工作者完成他們的任務(URL請求和數據庫查找)時,它將回調推送到事件隊列。當Node沒有讀取代碼(堆棧爲空)時,它會進入事件隊列並按順序執行這些任務。