RxJS BehaviorSubject: вернуть текущее значение или получить новое на основе условия - PullRequest
0 голосов
/ 28 июня 2019

У меня есть тема, на которую подписаны потребители:

private request$: Subject<Service> = new BehaviorSubject(null);

Это функция, которую мои компоненты вызывают при инициализации:

public service(id: number): Observable<Service> {
    return this.request$
        .pipe(
            switchMap((request) => request && request.serviceId ? of(request) : this.requestById(id)));
}

и сервисный звонок:

private requestById(serviceId: number): Observable<Service> {
    // http call 
}

Разные компоненты вызывают эту функцию с разными id с. Я хотел бы обновить / обновить тему, если значение входящего параметра id не соответствует значению id текущего субъекта.

Это возможно сделать? Я видел функцию iif, но не думаю, что она мне подходит полностью.

Спасибо

1 Ответ

1 голос
/ 28 июня 2019

Вот что вы можете сделать:

public service(id: number): Observable<Service> {
    return this.request$
        .pipe(
          //this is needed to ensure to avoid second evalution after doing next once
          //we got the new service value from the API
          take(1),
          switchMap((request) => {
            if(request && request.serviceId === id) {
              return of(request);
            } else {
              return this.requestById(id) 
                         .pipe(
                           //i am assuming that response of this.requestById is an instance of 'Service'; 
                           //update the subject
                           tap(s => this.requests$.next(s))
                         );
            }
          })
        );
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...