2016-06-10 11 views
18

chciałbym aby coś takiego:Jak zrobić sekwencję łańcucha w rxjs

this._myService.doSomething().subscribe(result => { 
    doSomething() 
}); 
.then(() => dosthelse()) 
.then(() => dosanotherthing()) 

więc chciałbym aby łańcuch .then jak w obietnicy. Jak to zrobić w RxJ?

this._myService.getLoginScreen().subscribe(result => { 
     window.location.href = MyService.LOGIN_URL; 
     /// I would like to wait for the site to load and alert something from  the url, when I do it here it alerts the old one 
    }); 
    .then (alert(anotherService.partOfTheUrl()) 


getLoginScreen() { 
    return this.http.get(myService.LOGIN_URL) 
.flatMap(result => this.changeBrowserUrl()) 
.subscribe(result => //i want to do sth when the page is loaded//); 
} 

changeBrowserUrl(): Observable<any> { 
return Observable.create(observer => { 
window.location.href = myService.LOGIN_URL; 
observer.next(); 
}); 
} 
+0

Możliwy duplikat [łańcuchowym RxJs obserwable kątowej 2] (http://stackoverflow.com/questions/37180607/chaining-rxjs-observables-in -wymiarowy-2) – rinukkusu

+0

zwróć uwagę na swoje typy !! '.subscribe' zwraca' Disposable' not an 'Observable' – user3743222

Odpowiedz

-4

Możemy użyć metody toPromise który pozwala przekształcić obserwowalnych sekwencję do obietnicy.

+0

Nie chciałbym tego użyć, ponieważ używam Observables –

+0

Istnieje również metoda Rx.Observable.fromPromise, która wywołuje wówczas metodę obietnicy obsługi obu powodzenia i błędy. – AngJobs

+3

OP zażądał informacji na temat łączenia obserwowalnych elementów - przyrzeczenia łańcuchowe nie mają znaczenia – Corbfon

34

Odpowiednikiem then dla obserwowalnych będzie flatMap. Można zobaczyć kilka przykładów stosowania tutaj:

Dla przykładu, można zrobić coś takiego:

this._myService.doSomething() 
    .flatMap(function(x){return functionReturningObservableOrPromise(x)}) 
    .flatMap(...ad infinitum) 
    .subscribe(...final processing) 

Przestrzegać rodzaje funkcji, które zwracają twoje funkcje, a także obserwowalne łańcuchy z flatMap będziesz musiał zwrócić obietnicę lub obserwowalne.

+5

Nie wiem, że powiedziałbym, że flatMap jest odpowiednikiem wtedy. FlatMap faktycznie wykonuje operację na danych. http://reactivex.io/documentation/operators/flatmap.html –

+2

Co zrobić, jeśli nie chcemy rezultatu n-tego obserwowalnego, ale zamiast tego chcemy oryginalnego wydarzenia bez transformacji? –

6

Jeśli wartością nieprzetworzoną jest lub dosanotherthing, operatorem jest map. Jeśli jest to obserwowalne, operatorem jest flatMap (lub odpowiednik).

Jeśli chcesz zrobić coś imperatywnie. Mam na myśli poza asynchronicznym łańcuchem przetwarzania, można użyć operatora do.

Zakładając, że dosthelse zwraca obserwowalne i dosanotherthing surowego obiektu, kod byłoby:

this._myService.doSomething() 
    .do(result => { 
    doSomething(); 
    }) 
    .flatMap(() => dosthelse()) 
    .map(() => dosanotherthing()); 

Zauważ, że jeśli wrócisz powrót metody subcribe będzie odpowiadać przedmiot subskrypcji i nie jest zauważalny. Obiekt subskrypcji służy głównie do anulowania obserwowalnego i nie może brać udziału w asynchronicznym łańcuchu przetwarzania.

W rzeczywistości przez większość czasu subskrybujesz na końcu łańcucha.

Więc chciałbym byłaby Twój kod w ten sposób:

this._myService.getLoginScreen().subscribe(result => { 
    window.location.href = MyService.LOGIN_URL; 
    /// I would like to wait for the site to load and alert something from  the url, when I do it here it alerts the old one 
    alert(anotherService.partOfTheUrl() 
}); 

getLoginScreen() { 
    return this.http.get(myService.LOGIN_URL) 
    .flatMap(result => this.changeBrowserUrl()) 
    .do(result => //i want to do sth when the page is loaded//); 
} 

changeBrowserUrl(): Observable<any> { 
    return Observable.create(observer => { 
    window.location.href = myService.LOGIN_URL; 
    observer.next(); 
    }); 
}