如果可观测量是由有限数据构成的,则它们自然完成。
import {Observable, Subject} from "rx";
let stream0$ = Observable.of("1", "2", "3");
let stream1$ = stream0$.map(x => x);
stream1$.subscribe(
(val) => { console.log("onNext", val) },
(err) => { console.log("onError", err) },
() => { console.log("onCompleted") }
);
// onNext 1
// onNext 2
// onNext 3
// onCompleted
如果没有,或者不要。但是观察者在主题上订阅了什么呢?例如:
import {Observable, Subject} from "rx";
let subj$ = new Subject();
let stream1$ = subj$.map(x => x);
stream1$.subscribe(
(val) => { console.log("onNext", val) },
(err) => { console.log("onError", err) },
() => { console.log("onCompleted") }
);
subj$.onNext("foo");
// onNext foo
" onCompleted"虽然源已结束但未记录。我们可以通过这个"结束"以某种方式向stream1$
发送事件。我在docs中找不到关于这些重要内容的信息。很高兴看到像Hot and Cold observables : are there 'hot' and 'cold' operators?这样的图表来确定事件流程。
答案 0 :(得分:4)
有了主题,你就完全掌控了。 Rx.Subject
实现了观察者界面,当您调用onNext
时,它就是observer interface。
主题
假设所有序列化和语法正确性都由主题的调用者处理。
这意味着您需要发出完成和错误的信号。要发出完成信号,请使用onCompleted
。仅供参考,这是前面提到的语法:
此语法允许可观察序列将任意数量(0或更多)的
onNext
消息发送到订阅的观察者实例,可选地后跟一次成功(onCompleted
)或失败({{1} })消息。指示可观察序列已完成的单个消息 确保可观察序列的消费者可以 确定性地确定进行清理是安全的 操作
单个故障进一步确保了中止语义 维护用于处理多个可观察序列的运算符。
注意:对于RxJS v5,观察者界面已更改,参见new interface
答案 1 :(得分:3)
How Complete and Error events actually work in RxJS是我做过的以下研究。
从那里引用自己。
完成时不应视为"程序结束时的事件"或者其他的东西。这是一个非常具体的事情。流完成只有三种可能的方式:1)成为有限
Observable
并自然完成2)成为Subject
并获得强制性onCompleted()
调用。 3)从上游获取完成事件。任何形式的流程终止/取消订阅都不会完成流。完成终止流。完成后,流中没有任何事情发生。
- 醇>
完成通过下游。
Observable
派生的Subject
在Subject
完成时完成。如果/Subject
完成,Observable
订阅的Observable
就会完成。