如何在rxjs中将多个订阅链接到可观察对象内?

时间:2019-03-04 17:21:28

标签: javascript angular rxjs

我想防止重复的http通话。我对一个可观察对象有多个订阅,并且该可观察对象具有一个switchMap,它决定是否会有http调用:

getModules(): Observable<Module[]> {
  return this.modules$.pipe(
    switchMap((modules: Module[]) => {
      if (!modules) {
        return this.setModules(); // http call, returning observable
      }
      return this.modules$; // observable
    })
  );
}

然后在应用程序的不同组件中有多个订阅,调用此方法。如何防止多次http通话?我需要延迟调用http观察值,而不是延迟发出的值。

2 个答案:

答案 0 :(得分:0)

只需将Observable存储为public服务属性,而不是在代码中的任何地方调用getModules().subscribe(...),因为这样做会实例化多个Observable。 实际上,pipe运算符会在每次调用时产生一个新的Observable

答案 1 :(得分:0)

这是我通过@Lazy Coder解决此问题的方法: 我为getModules()添加了一个“忙”标志,并让订阅处于打开状态,以便当http观察者更新源模块$时通知订阅者。

private getModules(): Observable<Module[]> {
    return this.modules$.pipe(
      switchMap((modules: Module[]) => {
        if (!modules && !this.isBusy) {
          return this.setModules(); // updates the modules$ source when complete
        }
        return this.modules$;
      })
    );
  }