RxJS:分享()一个Observable&向每个新订户发送最后一个值

时间:2017-06-30 09:34:31

标签: angular rxjs observable angular2-services

我正在使用.share()在服务的所有订阅者之间共享一个Observable:

@Injectable()
export class ChannelsService {
    private store: IChannel[] = [];
    private _own: BehaviorSubject<IChannel[]> = new BehaviorSubject([]);
    readonly own: Observable<IChannel[]> = this._own.asObservable().share();
    ...(the rest of the service basically makes CRUD http request and then calls this._own.next(result) to emit the result to all subscribers)
}

问题: 只有第一次订阅Observable(ChannelsService.own.subscribe(...))才能获得初始数据,其余订阅获得'null'作为第一个订阅的值。接下来调用this._own.next(result)将正确地向所有订阅者发出其值。

如何在多个订阅者中使用.share()一个Observable并获取为所有订阅者发出的最后一个值? (我已经尝试过.share()。last()但是没办法......)。

谢谢!

3 个答案:

答案 0 :(得分:1)

你可能想要shareReplay()(因为RxJS 5.4.0)或publishReplay().refCount()在RxJS&lt; 5.4.0。

例如:

this._own.asObservable()
  .publishReplay(1)
  .refCount()
  .take(1);

答案 1 :(得分:0)

一些小改进:

@Injectable()
export class ChannelsService {
    private store: IChannel[] = [];
    private _own: BehaviorSubject<IChannel[]> = new BehaviorSubject([]);
    get own(){
      this._own.asObservable();
    }
}

现在,您可以在组件中执行以下操作:

channels$: Observable<IChannel[]> = this.service.own;

不要忘记如果你手动订阅它就取消订阅

答案 2 :(得分:0)

您的结果是使用没有初始化值的共享的预期结果。 Explanation

之前评论过..你有快捷方式可以帮助你解决这个用例。只是一个简单的补充:给予&#34; null&#34;作为初始值并由那些不是的人过滤。

const subject = new Rx.Subject();

const behaviorWithoutShortcut = subject
  .multicast(new Rx.BehaviorSubject(null))
  .refCount()
  .filter(function (x) { return x !== null; });

const behaviorWithShortcut = subject
  .publishBehavior(null)
  .refCount()
  .filter(function (x) { return x !== null; });

我刚做了一个例子jsbin example