2013-06-21 36 views
2

在呈現頁面之前,我必須向mongodb發出幾個請求。下面是我現在該怎麼辦呢(db.js是我的數據庫處理層):通過node.js完成對Mongodb的異步請求

db.findUser(objid, function(result1){ 
    db.findAuthor(objid, function(result2){ 
    db.findSmthElse (objid, function(result3){ 
     res.render('template', { 
     user: result1, 
     author: result2, 
     smthelse: result2 
     }); 
    }); 
    }); 
}); 

我想這樣methos殺死異步的想法。不過,只有在處理完所有請求後,我才需要調用res.render。如何啓動它的異步?我應該如何使用異步庫:multiple async mongo request in nodejs還是有更合適的解決方案嗎?謝謝。

+1

決定使用異步庫。在您提供的鏈接中使用類似的解決方案來接受您的答案。 –

+1

同意@MattCain - 除非你正在構建一些微不足道的東西,否則你有可能會被迫在某個時候使用類似異步的東西 - 不妨瞭解它。 – UpTheCreek

回答

0

我想這樣methos殺死異步

沒有他們不這樣做的想法。這正是異步I/O應該如何工作的原因。但是,我確實感到你的鏈接多個異步調用的痛苦。在你知道它之前,你可以有6或7個嵌套的匿名異步函數。

在我考慮使用像async或promise這樣的庫之前,我會使用兩個標準。功能

  1. 號碼 - 這是有些主觀,但究竟有多少看起來令人沮喪嗎?你現在有3個,如果你可能堅持3個,那麼另一個庫可能不值得這個複雜性。再次,這是主觀的,完全是我的看法。
  2. 依賴關係 - 如果每個方法建立在前一個方法的結果上,則它們不能並行運行。然而,就你而言,這三個數據庫查詢是獨立的,只有res.render調用取決於鏈接的函數。在這方面,你的用例是async.parallel的一個很好的候選者。

我希望這可以幫助你讓你

+0

關於#2:有非常有用的[async.waterfall](https://github.com/caolan/async#waterfall),如果存在依賴關係,您可以使用它。 – robertklep

+0

@Brandon,robertklep謝謝,夥計們,我會試試你的解決方案。不幸的是,沒有辦法upvote( –