RxJS: Обновление наблюдаемого из нескольких потоков - PullRequest
0 голосов
/ 11 сентября 2018

Кажется, что это должен быть довольно распространенный паттерн, поэтому я надеюсь, что кто-то может помочь.

Я пытаюсь раскрыть Observable "Things" через службу Angular.Моему сервису необходимо сначала получить список вещей, а затем прослушать новые.Поэтому мне нужно сделать два разных запроса на обслуживание, но я пытаюсь обернуть их оба в одну наблюдаемую вещь, чтобы компонент-потребитель не беспокоился о внутренних компонентах.

Итак, выглядитчто-то вроде этого:

export class MyService {

  constructor(private commService: CommService){}

  get things(): Observable<Things[]> {

    // how can I get the initial list of things, then listen for updates?

    //THIS DOESN'T WORK
    return merge(commService.getAllInitialThings(), commService.listenToThingAdded());
  }

}

export class CommService{

  getAllInitialThings(): Observable<Things[]> { //etc }

  listenToThingAdded(): Observable<Thing> { //etc  }
 }

Я сделал несколько попыток использования concat и merge, но я не знаю, как

  1. Убедитесь, что getThings () завершается первым
  2. Обновите свойство вещи, поскольку оно является наблюдаемым

Обратите внимание, что listenToThingAdded может никогда не произойти, но мне все равно нужно будет вернуть первоначальный список вещей.

1 Ответ

0 голосов
/ 11 сентября 2018

То, что вы можете использовать, это BehaviorSubject, чем вам не нужно объединять или объединять или что-то в этом роде:

private things$: BehaviorSubject<Things[]>

getThings(): Observable<Things[]> {
   if (!this.things$) {
      const things = this.getThingsFormRequest(..);
      this.things$ = new BehaviorSubject(things);

   }
   return this.things$;
}

addThing(thing: Things): void {
   const updatedThings= this.things$.value;
   updatedThings.push(thing);
   this.things$.next(updatedThings)
}

При таком подходе Observalbe возвращаемая форма getThings будетобновляется, как только в массив добавляется новое значение (примечание: код написан от руки, поэтому я не могу гарантировать синтаксис)

...