如果条件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它是一种解决方法,更容易出现人为错误。
答案 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(...)