如何解决switchMap 中相同的 Observable
请看下面的代码:
class FooImplTest {
@Test
fun sample1() {
val booleanSubject = BehaviorSubject.create<Boolean>()
val intSubject = BehaviorSubject.create<Int>()
val stringSubject = BehaviorSubject.create<String>()
val combineSecondAndThird = Observable.combineLatest(intSubject,stringSubject,{ t1,t2 -> Pair(t1,t2) })
intSubject.onNext(1)
stringSubject.onNext("my str")
booleanSubject.onNext(true)
val o1 = combineSecondAndThird
.switchMap { pair ->
val i = pair.first
val s = pair.second
booleanSubject.switchMap {
intSubject.map { secondVal2 -> Triple(i,"$s:$it",secondVal2) }
}
}
.test()
.assertValue(Triple( 1,"my str:true",1))
intSubject.onNext(3)
o1.assertValueAt(1,Triple( 3,3))
.dispose()
}
}
我认为无需在 intSubject
内订阅 booleanSubject.switchMap
:
booleanSubject.map { Triple(i,i) }
我只是想知道是否存在任何边缘情况,原始代码会产生与简化代码不同的结果。
解决方法
你为什么不像下面的例子那样把三个主题都组合成combineLatest
?
@Test
fun sample1() {
val booleanSubject = BehaviorSubject.create<Boolean>()
val intSubject = BehaviorSubject.create<Int>()
val stringSubject = BehaviorSubject.create<String>()
val combined = Observable.combineLatest(
intSubject,stringSubject,booleanSubject,Function3<Int,String,Boolean,Triple<Int,Int>> { i,s,b ->
Triple(i,"$s:$b",i)
})
intSubject.onNext(1)
stringSubject.onNext("my str")
booleanSubject.onNext(true)
val test = combined
.test()
.assertValue(Triple(1,"my str:true",1))
intSubject.onNext(3)
test.assertValueAt(1,Triple(3,3))
.dispose()
}
测试通过,就像以前一样。当所有值都同步发出时,应该没有关系,因为 combineSecondAndThird#switchMap
应该总是首先被调用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。