如何在RxJS中创建Hot Observable 5

时间:2016-05-11 07:25:08

标签: javascript rxjs rxjs5

我使用RxJS 4创建Hot Observable,如official documentation

中的describe

但是RxJS 5 migration guid没有解释如何创建Hot Observable。

const source = Observable.create((observer) => {
  asynCall((data) => {
    observer.onNext(data)
  })
})
const published = source.publish()
published.connect()
published.subscribe((data) => {
  console.log(data)
})

使用Rx5我遇到以下错误:

未捕获的TypeError:source.publish不是函数(...)

2 个答案:

答案 0 :(得分:5)

您可以使用.publish().refCount()(或.share()作为别名)

var source = Rx.Observable.interval(1000)
    .take(5)
    .publish().refCount();

source.subscribe( item => console.log(`-: ${item}`));
setTimeout(() => {
    source.subscribe( item => console.log(`--: ${item}`));
}, 2500);

http://jsbin.com/cupibitehu/1/edit?js,console

上面设置了两个订阅,表明延迟订阅将从当前发出的发生位置开始,而不是重放先前发出的结果。

记录以下内容

"-: 0"
"-: 1"
"-: 2"
"--: 2"
"-: 3"
"--: 3"
"-: 4"
"--: 4"

http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-share

答案 1 :(得分:0)

这是对冷热可观测的看法

 Hot Observable

任何不会在订阅时产生新生产者的 observables(如果 obs.subscribe() 在 observable 上被调用,那么对于这个新创建的订阅,不应该有一个新的观察者.next(val)。它应该使用旧的,因此获得当前时间点的值)

Cold Observable

任何在订阅时产生新生产者的 observable - obs.subscribe() 基本上创建了 Observer.next() - 一个新的订阅源生产者。 Angular 中的所有 HttpCLient observables 都是这种类型。对于组件中的每个 obs.subscribe,您会看到 API 仅针对该订阅发出值。每次都是从头开始

所以基本上 publish() 和 refCount() 上面的 rxjs 操作符所做的是创建一个 observable,它同时表现得像一个 hot 和冷 observable。 Hot observable - 因为没有产生新的源值,Cold Observable - 因为它只有在订阅发生时才开始发出值 - obs.subscribe() 第一次被调用

所以为了产生一个不需要订阅就存在的 HotObservable,publish() 和 connect() 就可以了

var source = Rx.Observable.create({<some obj>})
   
    .publish();
source.connect();

source.subscribe( item => console.log(`-: ${item}`));
setTimeout(() => {
    source.subscribe( item => console.log(`--: ${item}`));
}, 2500);

您不会在控制台中看到任何内容,因为在订阅发生时,observable 会发出值。请注意,如果 observable 发出值有延迟,那么您可能会在订阅中看到它们 我也想赞扬这篇文章:它的解释很好 https://blog.thoughtram.io/angular/2016/06/16/cold-vs-hot-observables.html