为什么 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
及时将事件向前移动 - 包括完整的事件。那为什么会这样呢?
根据 documentation,Observable.just()
立即完成 - 因此消息将立即打印出来。
如果你想在延迟后打印消息,你应该这样修改它
Observable.just(1)
.delay(500, TimeUnit.MILLISECONDS)
.doOnComplete(() -> view.append("second stream complete"))
如果您查看 just(即 ObservableScalarXMap.java 中的 ScalarDisposable)运算符的源代码,您会发现它所做的只是发出一个具有提供值的 onNext
事件紧接着它发出 onComplete
事件。在您的示例中,您已将 doOnComplete
放在 delay
运算符之前 - 这就是为什么 doOnComplete
会立即被调用,之后事件会延迟 500 毫秒。
我只是用 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
及时将事件向前移动 - 包括完整的事件。那为什么会这样呢?
根据 documentation,Observable.just()
立即完成 - 因此消息将立即打印出来。
如果你想在延迟后打印消息,你应该这样修改它
Observable.just(1)
.delay(500, TimeUnit.MILLISECONDS)
.doOnComplete(() -> view.append("second stream complete"))
如果您查看 just(即 ObservableScalarXMap.java 中的 ScalarDisposable)运算符的源代码,您会发现它所做的只是发出一个具有提供值的 onNext
事件紧接着它发出 onComplete
事件。在您的示例中,您已将 doOnComplete
放在 delay
运算符之前 - 这就是为什么 doOnComplete
会立即被调用,之后事件会延迟 500 毫秒。