【问题标题】:Choose one observable based on condition根据条件选择一个 observable
【发布时间】:2016-10-15 19:47:56
【问题描述】:

我正在编写一个 ng2 应用程序并使用基于公开可观察对象的行为主题的应用程序状态服务。对于大多数用例,我想使用 observable 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 和 account Id 等
  2. 如果 A 没有此值,则选择 B

我也希望在组件中做的只是公开/拥有一个可观察的实例变量,以便我可以保持我的视图/html 相同。

即使你不熟悉 Angular 2,我也可以解决这个问题,但需要帮助理解如何使用 observables 实现一个 if 语句。

【问题讨论】:

    标签: angular rxjs rxjs5


    【解决方案1】:

    试试这个:

    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))。

    【讨论】:

    • 所以当你映射(只是想了解你的 cmets)时,你是否订阅了 observables 以提取它们的值......结果 A/b 是什么?
    • @Barry 是的,resultA/BobservableA/B 发出的。请参阅文档中的示例:combineLatest
    • 所以一旦我完成了我的地图,我就“知道”我想选择哪个 Observable 等等......你能进一步解释一下take(1) 吗?我的想法是在地图逻辑中,我可以将公开的实例变量设置为正确的 observable 并且是完整的,但是我需要做任何事情来停止这个链吗?
    • map 只是根据您传递的值转换值。不是订阅,而是给产线增加一个阶段——订阅启动产线。
    • @Sasca 我认为这不对。您要么需要接受map 中的两项组成的数组,要么提供双参数映射函数作为combineLatest 的第三个参数。传递给map 的函数只接受一个参数。
    【解决方案2】:

    您可能还想考虑amb,它使用首先发出一个值并从第二个取消订阅的任何一个可观察对象:

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

    【讨论】:

      猜你喜欢
      • 2013-06-02
      • 1970-01-01
      • 1970-01-01
      • 2015-07-01
      • 1970-01-01
      • 2012-06-02
      • 1970-01-01
      • 2011-11-12
      • 1970-01-01
      相关资源
      最近更新 更多