RXJS Observable的冷,热和Subject

Observable 热:直播。所有的观察者,无论进来的早还是晚,看到的是同样内容的同样进度,订阅的时候得到的都是最新时刻发送的值。

Observable 冷:点播。 新的订阅者每次从头开始。

冷的Observable例子:

一开始有个订阅者,

两秒后又有个订阅者,这两个序列按照自己的节奏走的,不同步。每个流进行都会从interval的0开始。

console.log('RxJS included?', !!Rx);

const count$ = Rx.Observable.interval(1000).take(5);
const sub1 = count$.subscribe((val)=>{
  console.log(val);
});

setTimeout(function(){
  const sub2 = count$.subscribe((val)=>{
  console.log(val);
});
},2000);

RXJS Observable的冷,热和Subject

热的Observable例子

第二个订阅者直接从2开始起,跟第一个订阅者看到的内容是一样的。

const count$ = Rx.Observable.interval(1000).take(5).share();
const sub1 = count$.subscribe((val)=>{
  console.log(val);
});

setTimeout(function(){
  const sub2 = count$.subscribe((val)=>{
  console.log(val);
});
},2000);

RXJS Observable的冷,热和Subject

 

二、Subject

RXJS Observable的冷,热和Subject

Subject即是观察者Observer,也是被观察对象Observable,同时实现了这两个接口。

意味着

  • 一方面它可以作为流的组成的一方,输出的一方。
  • 另一方面,它可以作为流的观察一方,接收一方。

Subject分为ReplaySubject和BehaviorSubject。

ReplaySubject:这种Subject会保留最新的n个值

BehaviorSubject:是ReplaySubject的特殊形式。 保留最新的一个值

【20200529】

拿subject做一个observer观察者,看Observable会丢什么东西出来,由它对外广播出去。

再拿subject去订阅两个观察者。

有n个observable去订阅subject,但是subject只会发出一个订阅的要求订阅原始observable。

1、subscribe的等价写法

subscribe 后面写的一个函数,相当于语法糖,快捷方式,临时创建冷一个observer对象。

默认情况应该是传入一个observer对象

console.log('RxJS included?', !!Rx);


const counter$ = Rx.Observable.interval(1000).take(5);

const subject = new Rx.Subject();

const observer1 = {
  next: (val)=>{console.log('1: ' +val);},
  error: (err)=>{console.log('ERROR>> 1:'+ err);},
  complete: ()=>{console.log('1 is complete');}
}


const observer2 = {
  next: (val)=>{console.log('2: ' +val);},
  error: (err)=>{console.log('ERROR>> 2:'+ err);},
  complete: ()=>{console.log('2 is complete');}
}

//等价写法
counter$.subscribe(val =>{console.log(val);});
counter$.subscribe(observer2); 

RXJS Observable的冷,热和Subject

2、两个observer ,两次subscribe

console.log('RxJS included?', !!Rx);


const counter$ = Rx.Observable.interval(1000).take(5);

const subject = new Rx.Subject();

const observer1 = {
  next: (val)=>{console.log('1: ' +val);},
  error: (err)=>{console.log('ERROR>> 1:'+ err);},
  complete: ()=>{console.log('1 is complete');}
}


const observer2 = {
  next: (val)=>{console.log('2: ' +val);},
  error: (err)=>{console.log('ERROR>> 2:'+ err);},
  complete: ()=>{console.log('2 is complete');}
}

counter$.subscribe(observer1);

setTimeout(function(){
  counter$.subscribe(observer2);
},2000);
View Code

相关文章: