【问题标题】:RxJs - Subscribe to observable at last placeRxJs - 在最后一个地方订阅 observable
【发布时间】:2017-08-01 13:40:10
【问题描述】:

我有一个 Angular 4 应用程序。在这个应用程序中,我有一个 paypal 服务,它执行一些服务器工作并(从客户端)导航到 paypal。

 
@Injectable()
export class PaypalService {
  private readonly http: HttpApi;

  constructor(private readonly httpFactory: HttpFactoryService) { 
    this.http = httpFactory.get(HttpRequestType.Secured);
  }

  checkout(transactionId: string):
   Observable<Response> {
    let subscriber = this.http.post(environment.paymentServer + '/pay', {transactionId: transactionId})
    subscriber.subscribe((response:Response) => {
        let result = response.json();
        window.location.href = result.paymentUrl;
    });
    return subscriber;
  }
}

我希望 window.location.href 仅在所有订阅者都收到通知后才被调用。

paypal.checkout("1234").subscribe(() =>
//This code should be called before the navigation will start
doSomeCleaning())

我知道我可以使用延迟,但我想知道是否有更好的选择。

【问题讨论】:

  • 尝试使用 flatMap 运算符映射所有流,最后只有一个订阅方法可以调用重定向。

标签: angular rxjs rxjs5


【解决方案1】:

由于您需要强制按特定顺序调用观察者,因此您不应依赖它们的订阅顺序。最简单的方法是立即使用setTimeout()

observable.subscribe((response:Response) => {
    let result = response.json();
    setTimeout(() => window.location.href = result.paymentUrl);
});

或者也许更好和更多的 Rx 方法是使用 observeOn 运算符和 async 调度程序将值发送给另一个 JS 事件中的第一个观察者。

import { async } from 'rxjs/scheduler/async';

...

let observable = ...
observable.observeOn(async).subscribe(...);

return observable;

【讨论】:

  • 感谢您的帮助。您能否详细介绍一下异步解决方案?
  • 你想知道什么?
  • observable.observeOn(async) 会做什么?
  • 它甚至在单独的 JS 中运行每个发射。就像您使用 setTimeout() 一样。
【解决方案2】:

你为什么不在回调中做如下重定向:

paypal.checkout("1234").subscribe((res) =>{
   doSomeCleaning();
   window.location.href = res.paymentUrl; 
});

【讨论】:

  • 我不想让其他组件知道到 paypal 的导航
猜你喜欢
  • 2020-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-11
  • 2019-09-15
  • 2016-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多