2017-07-28 77 views
1

我有一個方法問題。目前,我正在使用$q.all在單一回報中捕獲多個承諾,然後將所有結果作爲單個請求處理。角度q.all即時與延遲響應

即:$q.all([promise1(),promise2(),promise3(),promise(4),promise5()])..then(function(response){ ...}

不過,我注意到,有時不同的承諾,在顯著不同時間段返回。所有的承諾都是對第三方網站的http調用。當任何特定承諾延遲了8秒...或14秒時,所有承諾的最終結果都會延遲相同的持續時間。最弱的......比較「最慢的」......連接綜合徵。

我可以使用另一種方法同時調用所有的承諾,但仍允許處理結果,並在用戶進入時查看?在不等待它們全部被返回之前,一次處理它們全部?

+0

不要將它們分組在「全部」中。而是分開使用它們。 –

回答

0

正如評論中所建議的那樣,您可以單獨使用它們,但是如果您真的想在同一時間全部打電話給他們並且在一個承諾中處理他們,您可以使用承諾的回調函數notify。我創建了一個擴展$q使用此功能notify()解決的承諾作爲一個:

app.run(function($q){ 
    $q.each = function(promises){ 
     var deferred = $q.defer(); 

     promises.forEach(function(promise){ 
      promise.then(function(data){ 
       deferred.notify(data); 
      }); 
     }); 
     return deferred.promise; 
    }; 
}); 

這是一個非常幼稚的做法是不處理的情況下錯誤,但它給你一個什麼樣的想法參與其中。

然後,你只需要使用它像這樣:

var promises = [promise1(),promise2(),promise3(),promise(4),promise5()]; 

$q.each(promises).then(null, null, function(data){ 
    console.log(data); // This is called when each promise resolves. 
}); 

Here's a Plunker showing this in action

+1

謝謝尼古拉克 - 這是我所尋找的更多。它現在給了我一些想法,我將在週末開展類似的工作。會回覆問題和/或結果。謝謝。 – rolinger

0

請記住,像then()$q.all()方法並不確定的承諾是如何執行的;他們只是在你想要回應時建立語義。我的意思是,當你創造這些承諾時,即使流利的myPromise.then(doSomething)看起來似乎暗示其他意思,它們也會開始運行。

再加上與事實$q.all沒有那麼多「相結合的承諾」,因爲它創建一個新的承諾,解決了將拒絕在原有基礎上的承諾的分辨率或排斥狀態;並且承諾並不僅限於單個處理程序...

promise1.then(function() { 
    //stuff that only cares about promise1 and needn't wait for the others 
}); 
$q.all(promise1, promise2, ...).then(function() { 
    //stuff that can't be done until everything finishes 
});