2014-03-28 36 views
5

我正在使用Restangular對服務器執行多個同時調用。 Restangular回報承諾每一個行動,他們每個人都需要做一些具體的回報,一旦所有3完成,他們的.then功能已完成,我需要執行另一個功能。作爲一個羣體等待多個承諾,單個角度?

這是在這種情況下做承諾的正確方法嗎?

var a, b, c; 

a = service1.getList(...).then(function A(data) { do something; $log.debug('a'); return 'a';}); 
b = service2.getList(...).then(function B(data) { do something; $log.debug('b'); return 'b';}); 
c = service3.getList(...).then(function C(data) { do something; $log.debug('c'); return 'c';}); 

$q.all([a,b,c]).then(function wrapUp(values) { $log.debug(values); do something after functions A, B,and C above have finished;} 

我不知道,如果$ q.all()將在A,B和C的最末端運行,或者它可能在最後一個函數的前面比賽。 wrapUp()總是被稱爲last?

注意,A,B和C是承諾a,b和c完成後調用的函數。

傳遞給wrapUp的values數組似乎是A,B和C的返回值。但是,在我的控制檯中,函數A記錄10次,然後函數B記錄10次,然後函數C和函數包裝都記錄10次(交替)。

10倍的記錄看起來像是壞了.....,以及擔心競爭條件似乎是一個可能性....

有人能解釋這是怎麼回事?

Chrome Dev Console

+0

我測試了你的場景,它工作得很好,應該有另外一種情況,你怎麼觸發這個,也許我們應該看看?這裏你的場景在restangular模板http://plnkr.co/edit/Wp0FEVz8iwOyXf84pZ8h?p=preview –

+0

ng-grid似乎是罪魁禍首,不知何故,即使這個處理程序被稱爲10次restangular只發送3個請求到網絡服務器(作爲預期)每個嘗試的10個響應。冗餘結合請求是否相同,只是將它們添加到第一個請求所返回的承諾中? – boatcoder

回答

7

這是做承諾,在這種情況下,正確的方法是什麼?

是的。

10倍的記錄看起來像是壞了.....,以及擔心競爭條件似乎是一個可能性....

有人能解釋這是怎麼回事?

它實際上沒有損壞。就像你建議$q.all等待所有的承諾完成。

在:

$q.all([a,b,c,d]).then(function(){ 
    // yes, this only runs after all of the promises fulfilled 
}); 

這裏是發生了什麼:

您有運行10次的循環:

  • 一個從整個循環全部滿足瞬間調用。
  • 來自整個迴路的B呼叫都立即完成。
  • 調用C解析
    • 爲的是實例$q.all組成的諾言,B,C的一個(已經解決)的B(已經解決),現在的C - 滿足。
  • 下一個C呼叫解決
    • 對的,B,C的一個(已經解決)的B(已經解決),現在的C該實例的$q.all組成的諾言 - 實現。

依此類推。

你擁有的唯一保證就是環路該實例中的$q.all([a,b,c]當地 A,B和C之後完成。沒有別的,僅此而已。

如果你想鉤住所有返回值的總承諾,那麼你當然可以在它們全部10個上執行$q.all

+0

我想說,我沒有循環,因爲我只進行3次網絡調用,但我回去並添加了日誌記錄功能,以實現這個三重承諾,並且看到ng-grid使用rowItem調用我的更改函數10次.selected ......不知何故,即使我的行更改處理程序被連續調用10次,我只能進行3次網絡調用.......,但仍可獲得10個「成功響應」。 – boatcoder

+0

是的,ng-grid是這裏10次事件的罪魁禍首。與他們如何處理ngGridEventData有關,多次觸發一次數組源代替。 – boatcoder

+0

這可能是工作中的角度緩存,你可以把它關掉:) –