代码之家  ›  专栏  ›  技术社区  ›  aleixsuau

RxJS:Share()可观察并向每个新订阅者发出最后一个值

  •  4
  • aleixsuau  · 技术社区  · 7 年前

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

    @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)
    }
    

    问题:

    谢谢

    3 回复  |  直到 7 年前
        1
  •  4
  •   Graham francescalus    7 年前

    你可能想要 shareReplay() (自RxJS 5.4.0起)或 publishReplay().refCount()

    例如:

    this._own.asObservable()
      .publishReplay(1)
      .refCount()
      .take(1);
    
        2
  •  1
  •   Jota.Toledo    7 年前

    一些小的改进:

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

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

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

    别忘了

        3
  •  0
  •   Jorge Rodríguez Galán    7 年前

    您的结果是使用不带初始化值的共享时的预期结果。 Explanation

    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