与onExceptionResumeNext混淆将一个observable作为lambda表达式传递

时间:2018-05-29 17:01:23

标签: kotlin rx-java2

onExceptionResumeNext(Observable.just(10))

我有以下Observable,我试图抛出异常来测试OnError中异常的捕获。但是,当我将以下内容传递给1 2 10 onComplete fun main(args: Array<String>) { Observable.fromArray(1, 2, 0, 4, 5, 6) .doOnNext { if (it == 0) { throw RuntimeException("Exception on 0") } } .onExceptionResumeNext(Observable.just(10)) .subscribe( { println(it) }, { println("onError ${it.message}") }, { println("onComplete") } ) } 时,我得到以下输出:

1
2

 Observable.fromArray(1, 2, 0, 4, 5, 6)
            .doOnNext {
                if (it == 0) {
                    throw RuntimeException("Exception on 0")
                }
            }
            .onExceptionResumeNext { Observable.just(10) }
            .subscribe(
                    {
                        println(it)
                    },
                    {
                        println("onError ${it.message}")
                    },
                    {
                        println("onComplete")
                    } )
}

但是,如果我将lambda表达式传递给该方法,我会得到以下输出:

onExceptionResumeNext(Observable.just(10))

只是想知道这样做onExceptionResumeNext { Observable.just(10) }和执行此Console.WriteLine("Geef 10 gehele positieve getallen."); Console.WriteLine("Getal 1:"); int g1 = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Getal 2:"); int g2 = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Getal 3:"); int g3 = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Getal 4:"); int g4 = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Getal 5:"); int g5 = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Getal 6:"); int g6 = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Getal 7:"); int g7 = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Getal 8:"); int g8 = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Getal 9:"); int g9 = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Getal 10:"); int g10 = Convert.ToInt32(Console.ReadLine()); int gemiddelde = (g1 + g2 + g3 + g4 + g5 + g6 + g7 + g8 + g9 + g10)/10; int[] array = new int[10] {g1,g2,g3,g4,g5,g6,g7,g8,g9,g10};

之间有什么区别

非常感谢提前

1 个答案:

答案 0 :(得分:4)

在第一种情况下,您将observable传递给onExceptionResumeNext

如果原始观察中出现错误,您将被重新订阅传递给onExceptionResumeNext的可观察

这就是你获得&#34; 1&#34;和&#34; 2&#34;从原始来源然后&#34; 10&#34;和&#34; onComplete&#34;来自Observable.just(10)

在第二种情况下,您使用的是lambda语法,因此您可以有效地执行此操作:

.onExceptionResumeNext(object : ObservableSource {
    void subscribe(@NonNull Observer<? super T> observer) {
        Observable.just(10)
    }
})

如您所见,传递给您的observer未获订阅。因此,在&#34; 1&#34;之后没有任何东西被发现。和&#34; 2&#34;从最初的来源

你应该做的是

.onExceptionResumeNext { observer ->
    Observable.just(10).subscribe(observer)
}