2016-02-15 86 views
5

我想知道如果觀察到承諾可在下列情況下使用在角2使用:Angular 2承諾/可觀察鏈兩個事件?

有兩個異步上傳任務。我想知道如何檢測兩項任務是否完成。

我上傳任務(在承諾實施,但它很容易被改變,以觀察到如果需要的話)是這樣的:

myService.upload('upload1').then(() => { 
}) 

myService.upload('upload2').then(() => { 
}) 

如何將這兩個事件鏈在一起,要麼承諾可觀察到,以便我知道這兩項任務都完成了?謝謝

回答

5

complete當所有的源流關閉被執行。

Rx.Observable.merge(
    myService.upload('upload1'), 
    myService.upload('upload2').subscribe({complete:() => { ... }); 

,如果你想結果集的最大數量,以等待

Rx.Observable.merge(
    myService.upload('upload1'), 
    myService.upload('upload2') 
.take(2) 
.subscribe({complete:() => { ... }); 
+0

但得到一個錯誤信息: ***原始異常:ReferenceError:無法找到變量:Rx *** –

+0

應該是這樣的:*** myService1.merge(myService2).subscribe()***。但這不是我想要的。我想要的是獲得最後的事件。 –

+0

你是否需要最後一個活動,或者你只是想知道什麼時候發生了最後一個活動,這就是'complete'的用途(只有在活動結束後發件人關閉源活動時纔有效) –

7

您可以使用Combining Operators之一與observables。 Observable.zip(),例如,可與承諾...

Observable.zip(
    first, 
    second, 
    function (firstResolvedValue, secondResolvedValue) { 
     return firstResolvedValue && secondResolvedValue; 
    } 
) 

zip accepts a variable number of Observables or Promises as parameters, followed by a function that accepts one item emitted by each of those Observables or resolved by those Promises as input and produces a single item to be emitted by the resulting Observable.

7

使用forkJoin,這相當於q.all $從角的1.x(a和b是觀測) :

Rx.Observable.forkJoin([a,b]).subscribe(t=> { 
     var firstResult = t[0]; 
     var secondResult = t[1]; 
}); 
2

您可以使用Promise.all它返回一個新的承諾,解決當所有的參數數組中的承諾已經解決。

Promise.all([myService.upload('upload1'), myService.upload('upload2')]).then(() => { 
    // ... 
}); 

請注意,如果您myService.upload方法返回一個承諾,而不是承諾,您可以訪問返回值是這樣的:

Promise.all([myService.upload('upload1'), myService.upload('upload2')]) 
    .then((retValue1, retValue2) => { 
    // ... 
});