【问题标题】:RXJS Get Current Value of a ReplaySubjectRXJS 获取 ReplaySubject 的当前值
【发布时间】:2017-10-15 00:17:43
【问题描述】:

我正在尝试在登录时从回复主题中提取当前值。在当前流中订阅时,返回前一个值而不是当前值。所以收到的东西是登录时以前的东西,而不是当前的东西。有没有办法在 ReplaySubject 中获取订阅时 observable 的当前值,而无需求助于 BehaviorSubject?

stuff.service.ts:

 private _stuffSubject = new ReplaySubject<any>();
 private _stuff$: Observable<any> = this._someSubject.asObservable();

  get stuff$ () {
   return this._stuff$;
  }

  private fetchStuff () {
    return this.http.get('/stuff/current')
      .map(data =>  {
        return data.json()
      })
      .catch(err => {
        console.debug(this.constructor.name, 'handled error ->', err.message);
        return Observable.of(false);
      })
      .map(stuff => {
        this._stuffSubject.next(stuff);
      })
  }

stuff.component.ts:

this.stuffService.stuff$
  .subscribe(({stuff1, stuff2, stuff3}) => {
    this.stuff1 = `${stuff1}`;
    this.stuff2 = `${stuff2}`;
    this.stuff3 = `${stuff3}`;
  });

【问题讨论】:

  • 您始终可以订阅_stuffSubject 以获取其当前缓冲区,但您无法判断它何时发出所有项目。

标签: angular rxjs behaviorsubject


【解决方案1】:

您可以将缓冲区大小设置为 1:

private _stuffSubject = new ReplaySubject<any>(1);

【讨论】:

  • ReplaySubject(1) 就像BehaviourSubject(),但我认为它会缓冲第一个并丢弃后续(直到订阅,然后缓冲区可以再接受另一个)?
  • 嗨@asmmahmud,你说得非常正确,缓冲区存储了最后一个值。
  • ReplaySubject 允许您缓冲 [n] 个以前的值: const mySubject = new Rx.ReplaySubject(2) 将缓冲 2 个以前的值...
  • 其实不太一样,BehaviorSubject 将第一次解析一个值,即使它是一个未定义的值,而ReplaySubject 在发出值之前不会解析
猜你喜欢
  • 2021-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
  • 2019-05-07
  • 1970-01-01
相关资源
最近更新 更多