如果ReplaySubject在RXJS中没有发出任何值,则startWith操作符。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果ReplaySubject在RXJS中没有发出任何值,则startWith操作符。相关的知识,希望对你有一定的参考价值。

我有一个如下的重播主题。

@Injectable()
export class ViewByService implements OnDestroy {
  private _selectedViewBy$ = new ReplaySubject<ViewByContext>(1);
  public selectedViewBy$ = this._selectedViewBy$.asObservable();
  constructor() {}
  setViewBy(viewBy: ViewByContext): void {
    this._selectedViewBy$.next(viewBy);
  }
  ngOnDestroy(): void {
    this._selectedViewBy$.complete();
  }
}

当我在发出值后订阅时,我得到的最后一个值是我的期望值 bufferCount 是1.

我需要什么

在消费者方面,当我在订阅这个。ReplaySubject如果它有比我更早发出的值,我应该得到最后一个值,但如果我没有发出任何值从这个 ReplaySubject 那么我想 startWith 一些默认值。但我的 startWith 只有在没有从 ReplaySubject.

现在,当我这样做,

this.viewByService.selectedViewBy$.pipe(
  startWith({ code: 'DEFAULT'})
)

当我没有任何值从 ReplaySubject 我在推 DEFAULT 这很好,但当我在我的 ReplaySubject 然后,我看到它正在推动两个 DEFAULT 和之前发出的值。

我们如何有条件地运行 startWith 只要 ReplaySubject 之前没有发出过任何数值。

谢谢。

答案

你可以考虑使用 BehaviorSubject 结合 shareReply 操作员,像这样

const b = new BehaviorSubject<any>({ code: 'DEFAULT'});
const s = b.pipe(shareReplay(1));

如果 b 在您认购之前就会发出,那么当您认购时,就会发出 shareReply 确保你得到最后发出的值。

如果您在 b 发出的任何值,当你订阅时,你会得到在 BehaviorSubject 构造者。

以上是关于如果ReplaySubject在RXJS中没有发出任何值,则startWith操作符。的主要内容,如果未能解决你的问题,请参考以下文章

RxJs。如果我有两个 observable,如何抛出错误并继续发出值?

在注册之前验证可观察的响应以执行多个请求(iff)-RxJs

RxJS有角度

一个可作为 ReplaySubject 但仅适用于第一个订阅者的 Rx 可观察对象?

RxJS之过滤操作符 ( Angular环境 )

如何使用 RxJS 在 Angular 6 中发出一系列 http 请求