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

最后发布: 2020-08-03


问题

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

@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 之前没有发出过任何数值。

谢谢。

javascript angular rxjs reactive-programming
回答

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

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

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

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