为什么doOnComplete立即执行而不考虑delay()

时间:2018-09-25 06:24:50

标签: rx-java2 rx-android

我只是用takeUntil-

编写了一些示例代码
final Observable<Integer> stopper = Observable.just(1)
            .doOnComplete(() -> view.append("second stream complete"))
            .delay(500, TimeUnit.MILLISECONDS);

return Observable
            .range(0, 10)
            .zipWith(Observable.interval(100, TimeUnit.MILLISECONDS), (item, interval) -> item)
            .takeUntil(stopper)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io())
            .subscribe(view::append);

因此,理想情况下,塞子会在500毫秒后发射并终止第二个可观察到的物体,它确实会这样做。但是doOnComplete立即打印。 enter image description here

据我从文档中了解-delay将事件及时转移-包括完整事件。那么为什么会这样呢?

2 个答案:

答案 0 :(得分:1)

根据documentationObservable.just()立即完成-因此消息将立即打印出来。 如果您希望在延迟后打印该消息,则应这样修改

Observable.just(1)
        .delay(500, TimeUnit.MILLISECONDS)
        .doOnComplete(() -> view.append("second stream complete"))

答案 1 :(得分:1)

如果查看just的源代码(即ObservableScalarXMap.java中的ScalarDisposable)运算符,您会发现它所做的只是发出一个带有提供的值的onNext事件,此后立即它发出onComplete事件。在您的示例中,您已将doOnComplete放在delay运算符之前-这就是为什么doOnComplete立即被调用,并且此后事件被延迟500ms的原因。