RXJS,如果可观察为条件

时间:2016-01-11 18:48:23

标签: javascript rxjs

如果条件observable解析为true或false,我想使用Rx.Observable.if来运行两个observable中的一个。

我想要实现的目标如下:

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)对于您的条件可观察量,您无法保证条件不会发出更多下一个事件。 IMO它是一种解决方法,更容易出现人为错误。

2 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:1)

如何使用switch

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

flatMapLatest?如果我理解文档很好,这将与前者相同:

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