我使用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不是函数(...)
答案 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