根据条件选择一个可观察对象

Choose one observable based on condition

我正在编写一个 ng2 应用程序并使用基于公开可观察对象的行为主题的应用程序状态服务。对于大多数用例,我想使用可观察 A 来查找嵌套对象。我发现一个奇怪的情况,Observable A 不会有这个数据,但它在 Observable B 中。Observable A 和 B 都可以从我的应用程序状态服务中获得。

现在在我的组件中它看起来像这样

  sharedState: Observable<any>;

  constructor(private appStateService: AppStateService) {
    this.sharedState = appStateService.shared$;
  }

那么在我看来:

<div>{{ (sharedState | async)?.loadedAccountDetails?.accountId }}</div>

举个例子。我想象我现在需要在组件中做的是:

  1. 订阅 Observable A 并检查它是否有我的 loadedAccountDetails 和帐户 ID 等
  2. 如果 A 没有此值,则选择 B

我也希望在组件中做的只是 expose/have 一个作为 Observable 的实例变量,这样我就可以保持我的 view/html 不变。

即使您不熟悉 Angular2,我也可以解决这个问题,但需要帮助了解如何使用可观察对象几乎实现 if 语句。

试试这个:

Observable
  // When any of the inner observables emit, supply latest from all
  .combineLatest(observableA, observableB)
  // Emit either result
  .map(([resultA, resultB]) => resultA || resultB)
  // Test it
  .subscribe(console.info)

只要确保 observableA/B 在找不到您要查找的内容时不会发出任何信息(例如,使用 .filter(Boolean))。

您可能还想考虑 amb,它使用第一个发出值并取消订阅第二个值的观察者:

Observable.amb(
    firstSource.filter(x => x.loadedAccountDetails),
    secondSource.filter(x => x.loadedAccountDetails)
)
.subscribe(x => { })