这永远不会完成:
Completable.complete()
.andThen{ Completable.complete() }
.test()
.assertComplete()
这样做完成了:
Completable.complete()
.andThen(Completable.complete())
.test()
.assertComplete()
根据杰克沃顿的说法:
“你想要andThen(Completable.complete())
。注意使用括号和
不是花括号。后者创建一个不调用其发射器的lambda。“
参考:https://github.com/ReactiveX/RxJava/issues/5551
任何人都可以更详细地解释一下吗?我以为我理解了lambda,但这确实让我感到震惊。
答案 0 :(得分:3)
使用大括号,您正在使用SAM conversion并通过在lambda中描述其单个方法来定义匿名CompletableSource
实例。
这与执行以下操作相同:
Completable.complete()
.andThen(object: CompletableSource {
override fun subscribe(cs: CompletableObserver) {
Completable.complete()
}
})
.test()
.assertComplete()
正如您所看到的,在CompletableSource
内部,除了创建Completable
实例并丢弃其结果之外,您什么都不做。要使链继续,您必须调用已作为参数收到的CompleteableObserver
上的方法(例如,您可以在其上调用onNext()
和onComplete()
)。
虽然它的语法几乎相同,但这是Java版本,以防它帮助您理解:
Completable.complete()
.andThen(new CompletableSource() {
@Override
public void subscribe(CompletableObserver cs) {
Completable.complete();
}
})
.test()
.assertComplete();
答案 1 :(得分:1)
括号中的有效示例如下:
执行 Completable.complete()
,然后将其作为参数传递给andThen
。
无效的人只是将花括号中的lambda作为参数传递给andThen
,这成为SAM Conversion的实现(感谢CompletableSource
)。它永远不会被执行。以下显示了您的操作:
val compl = CompletableSource { Completable.complete() }
Completable.complete()
.andThen (compl)
.test()
.assertComplete()
.assertComplete()