2016-02-15 20 views
5

Zastanawiam się, czy obserwowalne lub obietnica mogą być stosowane w następującym przypadku użycia w kątowym 2:Angular 2 obietnice/obserwowalne dwa łańcuchy wydarzeń?

Istnieją dwa zadania niesynchroniczne przesłać. Chciałbym wiedzieć, jak mogę wykryć oba zadania zostały zakończone.

Moim zadaniem wysyłania (realizowany w obietnicy ale to łatwo zmienić na obserwowalnym w razie potrzeby) jest tak:

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

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

Jak łańcuch te dwa zdarzenia razem w obu obietnicy lub obserwowalne tak, że wiem, że oba zadania są zakończone? Dzięki

Odpowiedz

5

complete jest wykonywany, gdy cały strumień źródłem są zamknięte.

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

jeśli chcesz ustawić maksymalną liczbę wyników czekać na

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

ale dostałem komunikat o błędzie: *** Wyjątek : ReferenceError: Nie można znaleźć zmiennej: Rx *** –

+0

Powinien być coś takiego: *** myService1.merge (myService2) .subscribe() ***. Ale tego nie chcę. To, czego chcę, to dostać ostatnie wydarzenie. –

+0

Czy potrzebujesz ostatniego wydarzenia, czy chcesz tylko wiedzieć, kiedy wydarzyło się ostatnie wydarzenie, do czego służy słowo "complete" (działa tylko wtedy, gdy obserwator źródła zostanie zamknięty przez nadawcę po zdarzeniu) –

7

Możesz użyć jednego z Combining Operators z obserwowalnymi. Observable.zip(), na przykład, działa z obietnic ...

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

Zastosowanie forkJoin, co stanowi równowartość $ q.all z Kątowymi 1.x (A i B są obserwable) :

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

można użyć Promise.all która zwraca nową obietnicę, że gdy rozwiązuje wszystkich obietnic w tablicy argumentów zostały rozwiązane.

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

Uwaga, jeśli metoda myService.upload powrócił obietnica, zamiast obietnicy, można uzyskać dostęp do wartości zwracanych w ten sposób:

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