2015-02-07 25 views
1

我可能需要一些關於node.js應用程序的Q promise的幫助。我的使用情況如下:Q承諾:如何順序嘗試多個註冊表

  • 我們需要找到(通過ID)的一些信息(比如一個數量級)
  • 我們有可能包含的信息(目錄,數據庫,NoSQL的,REST服務的多個存儲庫。 ..)
  • 我們有一個搜索順序。我們不希望並行搜索並獲得最快的勝利,但我們需要依次搜索一個存儲庫
  • 我們可以停止搜索並忽略剩餘的存儲庫一旦我們發現信息
  • 我們已經每個存儲庫都有承諾

我正在努力的是創造/返回一個承諾,當信息被發現時完成。

類似的信息(僞代碼):

var deferred = Q.defer(id) 
foreach repo in repositories { 
    var p = repo.findById(id) 
       .then deferred.resolve(order) 
    p.waitForThePromiseToFinish 
    if (p.success) break 
} 

一個想法如何實現這一點?任何幫助表示讚賞。

回答

1

很像你的僞代碼,除了我們使用thenable鏈接,因爲這些動作是異步:

var p = Promise.resolve(); // start empty promise; 
repositories.forEach(function(repo){ 
    p = p.then(function(result){ // chain 
     if(result.success) return result; // assumes that result.success is true if good 
     return repo.findById(id); // call find by Id 
    }); 
}); 

這將解決一個承諾p,這將是第一個庫是全成,或拒絕,所有故障 - 請注意,這裏假定您的findById API是這樣的,它在成功查找時返回值爲result.success === true,否則返回result.success === false。讓我知道如果你有問題適應你的實際API或如果你有問題。玩得開心:)

+0

非常感謝。這種模式伎倆。只需要稍微擴展它,因爲'repo.findBy()'返回一個promise,我需要結果。我需要一個'成功===錯誤'的迴應,回購回答「找不到或錯誤」。 – Juergen 2015-02-08 07:58:08

+0

我很高興我可以提供幫助。隨時提出您遇到的任何其他問題,並提出尚未提出的承諾 - 他們將來會幫助人們 – 2015-02-08 12:25:43