请注意,这里得票更多的答案有点误导。请看下面的例子,我的想法是展示一些测试场景,并展示带有
andThen
操作符的完整逻辑的行为。
private fun doThingAFail(): Completable {
print("Do thingA Called\n")
return Completable.fromCallable {
print("calling stream A\n")
throw(Exception("The excep"))
}
}
private fun doThingB(): Completable {
print("Do thingB Called\n")
return Completable.fromCallable {
print("calling stream B\n")
}
}
private fun doThingA(): Completable {
print("Do thingA Called\n")
return Completable.fromCallable {
print("calling stream A\n")
}
}
请注意以下测试:
@Test
fun testCallAPlusB() {
doThingA().andThen(doThingB())
}
输出结果将是:
Do thingA Called
Do thingB Called
这里有一个小提示:请注意,我们在这个代码片段中没有订阅这些 Completable。
测试内容:
@Test
fun theTestSubscribe() {
doThingA().andThen(doThingB()).subscribe()
}
输出结果应该是:
Do thingA Called
Do thingB Called
calling stream A
calling stream B
最后,如果第一个可完成项失败,第二个可完成项将不会被执行。
@Test
fun theTestFailThingA() {
doThingAFail().andThen(doThingB()).subscribe()
}
输出结果将会是:
Do thingA Called
Do thingB Called
calling stream A
这里的关键概念是方法内部和observable内部的逻辑不同时执行。
当我们调用
doThingA()
和
doThingB()
方法时,"Do thingA Called" 和 "Do thingB Called" 行将被打印。而 "calling stream A" 和 "calling stream B" 行仅在有人订阅
doThingA
和
doThingB
方法时才会被调用。
第二个概念是 andThen 操作符如何处理错误。在上面的例子中,如果
doThingA()
completable 出现错误,将终止流,并且不会打印 "calling stream B" 行。
onError
事件终止。这是反应式流的一般行为。因此,回答您的问题,第二个Completable
不会被执行。 - Maksim OstrovidovandThen
并不能替代flatMapCompletable
,因为andThen
接受一个 Completable 实例,而flatMapCompletable
接受一个创建 Completable 的函数。前者是急切的,在调用时创建 Completable,而后者是惰性的,Completable 完成后才会被构建。对于急切版本,你可能在前一个 Completable 完成之前就开始构造 Completable,对吧? - Galder Zamarreño