Как выполнить последовательность цепочек в rxjs
Я хотел бы что-то вроде:
this._myService.doSomething().subscribe(result => {
doSomething()
});
.then( () => dosthelse() )
.then( () => dosanotherthing() )
Итак, я хотел бы цепочки. Так как в обещании. Как я могу сделать это в Rxjs?
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();
});
}
Ответы
Ответ 1
Эквивалент then
для наблюдаемых будет flatMap
. Вы можете увидеть некоторые примеры использования здесь:
В вашем примере вы можете сделать что-то вроде:
this._myService.doSomething()
.flatMap(function(x){return functionReturningObservableOrPromise(x)})
.flatMap(...ad infinitum)
.subscribe(...final processing)
Обратите внимание на типы возвращаемых функций, так как для отслеживания цепочек с помощью flatMap
вам нужно вернуть обещание или наблюдаемое.
Ответ 2
Если dosthelse
или dosanotherthing
возвращает необработанное значение, оператор должен использовать map
. Если это наблюдаемое, то оператор flatMap
(или эквивалент).
Если вы хотите сделать что-то императивно. Я имею в виду вне асинхронной цепочки обработки, вы можете использовать оператор do
.
Предполагая, что dosthelse
возвращает наблюдаемый и dosanotherthing
необработанный объект, ваш код будет:
this._myService.doSomething()
.do(result => {
doSomething();
})
.flatMap( () => dosthelse() )
.map( () => dosanotherthing() );
Обратите внимание: если вы вернете возврат метода подписи, он будет соответствовать объекту подписки, а не наблюдаемому. Объект подписки в основном предназначен для возможности отмены наблюдаемого и не может принимать участие в цепочке асинхронной обработки.
Фактически, большую часть времени вы подписываетесь в конце цепочки.
Итак, я бы реорганизовал ваш код следующим образом:
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();
});
}
Ответ 3
Мы можем использовать метод toPromise
, который позволяет преобразовать последовательность Observable в Promise.