为什么在对无限流进行 switchMap 时不触发 onComplete
Why onComplete not fired when an infinite stream is switchMap'ed
使用RxJava 2.2.8
:
Observable.fromCallable(() -> "Some data")
.subscribe(
s -> System.out.println(s),
e -> System.err.println(e),
() -> System.out.println("Completed")
);
输出
Some data
Completed
我的问题是为什么 onComplete
从来没有被调用过?
Observable.interval(1, TimeUnit.SECONDS)
.switchMap(t -> Observable.fromCallable(() -> "Some data"))
.subscribe(
s -> System.out.println(s),
e -> System.err.println(e),
() -> System.out.println("Completed")
);
输出
Some data
Some data
Some data
...
我知道 Observable.interval
会创建一个永无止境的流,所以没有 onComplete
。我对 switchMap
的理解是它 returns 一个可观察对象,它触发由内部可观察对象产生的事件(取消任何未决和展平),在本例中为 Observable.fromCallable
。
现在,这个 'inner' observable 确实有一个明确的结束(与外部 observable 不同),那么为什么 onComplete
没有在这个内部 Observable 上被调用?
为什么输出不是这样的?
Some data
Completed
Some data
Completed
Some data
Completed
...
The resulting ObservableSource completes if both the upstream
ObservableSource and the last inner ObservableSource
由于上游 ObservableSource 是无限流,因此生成的 Observable 将无法完成。
另请注意,根据 observable contract,onComplete 指示 observable 已终止并且将来不会发出任何进一步的项目,因此您永远不会看到 "Completed" 后跟一些其他项目无论您的实施如何。
使用RxJava 2.2.8
:
Observable.fromCallable(() -> "Some data")
.subscribe(
s -> System.out.println(s),
e -> System.err.println(e),
() -> System.out.println("Completed")
);
输出
Some data
Completed
我的问题是为什么 onComplete
从来没有被调用过?
Observable.interval(1, TimeUnit.SECONDS)
.switchMap(t -> Observable.fromCallable(() -> "Some data"))
.subscribe(
s -> System.out.println(s),
e -> System.err.println(e),
() -> System.out.println("Completed")
);
输出
Some data
Some data
Some data
...
我知道 Observable.interval
会创建一个永无止境的流,所以没有 onComplete
。我对 switchMap
的理解是它 returns 一个可观察对象,它触发由内部可观察对象产生的事件(取消任何未决和展平),在本例中为 Observable.fromCallable
。
现在,这个 'inner' observable 确实有一个明确的结束(与外部 observable 不同),那么为什么 onComplete
没有在这个内部 Observable 上被调用?
为什么输出不是这样的?
Some data
Completed
Some data
Completed
Some data
Completed
...
The resulting ObservableSource completes if both the upstream ObservableSource and the last inner ObservableSource
由于上游 ObservableSource 是无限流,因此生成的 Observable 将无法完成。
另请注意,根据 observable contract,onComplete 指示 observable 已终止并且将来不会发出任何进一步的项目,因此您永远不会看到 "Completed" 后跟一些其他项目无论您的实施如何。