Оператор launchWith, если ReplaySubject не имеет значения, испускаемого в RXJS - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть тема воспроизведения, как показано ниже:

@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 должно только значение pu sh, если нет значений, излучаемых из ReplaySubject.

Теперь, когда я делаю это:

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

Когда у меня нет значений, излучаемых с ReplaySubject я нажимаю DEFAULT, что нормально, но когда у меня есть значения в моем ReplaySubject, я вижу, что оно нажимает как DEFAULT, так и значение, которое было передано ранее.

Как мы можем условно запустить startWith тогда и только тогда, когда мой ReplaySubject ранее не выдавал никакого значения.

Спасибо.

1 Ответ

0 голосов
/ 23 апреля 2020

Возможно, вы захотите использовать BehaviorSubject в сочетании с оператором shareReply, например:

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

Если b выдает перед вашей подпиской, то при подписке shareReply гарантирует вы получаете последнее переданное значение.

Если вы подписываетесь до того, как b выдаст какое-либо значение, при подписке вы получите значение по умолчанию, определенное в конструкторе BehaviorSubject.

...