【问题标题】:RXJS if with observable as conditionalRXJS 如果以 observable 作为条件
【发布时间】:2016-01-11 18:48:23
【问题描述】:

我想使用Rx.Observable.if 来运行两个可观察对象之一,如果条件可观察对象解析为真或假。

我想要达到的效果如下所示:

Rx.Observable.if(conditionalObservable.map(x => x.length > 0), firstObservable, secondObservable).subscribe()

如果conditionalObservable 发送下一个,然后以真值完成,则应运行firstObservable,否则应运行secondObservable

现在显然这不起作用,因为Rx.Observable.if 需要一个有条件的函数,而不是一个可观察的。如何在 RXJS 中实现完全相同的功能?

注意:This issue 几乎相同,但我认为它不够简洁,因为 1)您必须有两个 pausable 语句和 2)除非您将 take(1) 附加到您的条件 observables,否则您可以'不保证条件不会发出更多的下一个事件。 IMO 这是一种解决方法,但会出现更多人为错误。

【问题讨论】:

    标签: javascript rxjs


    【解决方案1】:

    如果我理解得很好,你可以试试这样的:

    conditionalObservable.map(x => x.length > 0)
      .last()
      .flatMap(function(condition){
          return condition ? firstObservable : secondObservable});
      .subscribe()
    

    我添加了last 部分,因为您提到要在conditionalObservable 最后一个值上选择您的可观察对象(第一个或第二个)。

    我不确定if 运算符的值,因为它基于一个标量值进行切换,该标量值必须由选择器函数同步生成。因此,除非您使用该函数返回一个可在闭包中访问的变量,并且您可以在评估条件时对其进行修改,否则我认为它不是那么有用。即使这样,您的选择器也会变成一个不纯的函数,这不是用于测试目的的最佳实践。

    【讨论】:

      【解决方案2】:

      使用switch怎么样?

      conditionalObservable
        .map(x => x.length > 0 ? firstObservable : secondObservable)
        .switch()
        .subscribe(...)
      

      还是flatMapLatest?如果我很好地理解了文档,这将与前者一样:

      conditionalObservable
        .flatMapLatest(x => x.length > 0 ? firstObservable : secondObservable)
        .subscribe(...)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-21
        • 2017-04-05
        • 1970-01-01
        • 2023-01-30
        • 2017-03-09
        • 2021-10-27
        • 1970-01-01
        相关资源
        最近更新 更多