Подтвердить что ты не робот

Как выполнить последовательность цепочек в 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();
});
}
4b9b3361

Ответ 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.