为什么 doOnComplete 会立即执行而不管 delay()

why does doOnComplete execute immedeatily regardless of delay()

我只是用 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 立即打印。

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

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

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

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