2015-06-19 89 views
0

最終,我的知識如同幾小時前剛開始時那樣糟糕。但是,在我的頭上這應該工作:如何在不使用回調的情況下從Mongoose獲取數據?

getAll: function(callback){ 
    User.find({}, function (err, data) { 
     if (err) return console.error(err); 
     return data; 
    }); 
} 

var users = api.getAll(); 
console.log(users); //undefined 

但由於某些原因,我必須把它作爲一個回調來獲取數據的工作,像這樣:

getAll: function(callback){ 
    User.find({}, function (err, kittens) { 
     if (err) return console.error(err); 
     callback(kittens); 
    }); 
} 
var users = api.getAll(function (data) { 
    console.info(data); //does output data 
}); 

我怎樣才能選項之一,更容易閱讀2的工作?

+0

貓鼬的'find'是異步的,因爲是任何需要callba CK。所以在賦值時'api.getAll()'沒有任何相關性。可讀性是相當主觀的。對我來說,正確使用承諾或者寫得很好的回調會更具可讀性。 – Tony

+0

這將是一個很好的開始讓你的頭處理異步的地方:http://stackoverflow.com/questions/23667086/why-is-my-variable-unaltered-after-i-modify-it-inside-of -a-function-asynchron – JohnnyHK

回答

1

不幸的是,你不能。當你執行一個函數時,你會得到你從它返回的任何東西。如果您不返回任何內容,則默認爲undefined

取而代之的是基於獲得user的可讀性,您應該基於您獲得它後要做什麼。大概你會有一些你想要在用戶身上執行的動作,對吧? Promise可以讓你的代碼看起來比回調更好。

下面是與無極

getAll: function(callback){ 
    return User.findAsync({}); 
} 
api.getAll() 
.then(console.log) 
.catch(console.error); 

代碼重新編寫既然你想做的事是你的users(和/或console.errorerr在這種情況發生的情況),這正是上述「執行」 console.log所有代碼呢。

請注意,我用findAsync,這些來自Bluebirdpromisification

不過更現實的你有做其他事情功能/與你user

api.getAll() 
.then(filterSome) 
.then(manipulateSome) 
.then(sendSomewhere) 
.catch(console.error); 

每個那些功能可能看起來像這樣:

function filterSome(users){ 
    return users.reduce(function(p,e){ 
     if(…) p.push(e); 
     return p; 
},[]); } 

他們甚至可以在這種情況下,你將不得不使用更多的承諾異步功能:

function manipulateSome(users){ 
    return new Promise.all(user.map(function(user){ 
     return new Promise(function(resolve){ 
      someAsyncFunction(user, function(err, result){ 
       user.someProp = result.manipulated; 
       resolve(user); 
}); }); }));} 

如果仍然看起來雜亂無章,後來才知道,與即將到來的ES7上述所有會得到一個語法糖和你會做這樣的事情:

你可以從今天開始使用它與transpilers像BabelJS

+0

多好的答案。謝謝你,我還沒有聽說過那些沒有節點的老承諾,沒有足夠的時間去考慮使用它,而藍鳥在閱讀完它們之後肯定會讓它變得更容易。好一個 –

相關問題