RxJS:从多个流更新一个可观察的对象

时间:2018-09-11 17:56:45

标签: angular rxjs6

这似乎应该是一种相当普遍的模式,所以我希望有人可以提供帮助。

我正在尝试通过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 :(得分:0)

您可以使用的是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就会被更新(注意:代码是手工编写的,因此我不能保证语法)