onComplete如何在RxJS中实际工作

时间:2016-01-18 08:21:44

标签: javascript rxjs

如果可观测量是由有限数据构成的,则它们自然完成。

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?这样的图表来确定事件流程。

2 个答案:

答案 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. 完成时不应视为"程序结束时的事件"或者其他的东西。这是一个非常具体的事情。流完成只有三种可能的方式:1)成为有限Observable并自然完成2)成为Subject并获得强制性onCompleted()调用。 3)从上游获取完成事件。任何形式的流程终止/取消订阅都不会完成流。

  2.   
  3. 完成终止流。完成后,流中没有任何事情发生。

  4.   
  5. 完成通过下游。 Observable派生的SubjectSubject完成时完成。如果/ Subject完成,Observable订阅的Observable就会完成。

  6.