1

这永远不会完成:

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,但这真的让我很震惊。

4

2 回答 2

3

使用花括号,您正在使用SAM 转换并通过在 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();
于 2018-01-30T18:48:44.967 回答
1
  1. 括号中的有效示例如下:

    Completable.complete()被执行,然后作为参数传递给andThen.

  2. 无效的只是简单地将花括号中的 lambda 作为参数传递给andThen,它成为 的实现(感谢SAM ConversionCompletableSource。它永远不会被执行。以下显示了您的操作:

    val compl = CompletableSource { Completable.complete() }
    Completable.complete()
        .andThen (compl)
        .test()
        .assertComplete()
        .assertComplete()
    
于 2018-01-30T18:49:45.373 回答