包裹时不调用Finalize运算符

时间:2019-10-03 14:57:37

标签: angular rxjs

我正在使用角度服务来包装一些http调用,以管理应用程序的加载状态。

此服务存储呼叫状态以进行进一步处理。不幸的是,从未调用finalize函数。

这是包装纸:

searchWithLoader(obs: Observable<any>) {
   this.show();
   obs.pipe(finalize(() => {
      console.log("FINALIZE NOT CALLED");
      this.hide();
   }));

   return obs;
}

以及我通常所说的方式:

   let performanceLoader = this.loaderService.searchWithLoader(
      this.performanceDataService.getSomething({
        x: x,
        y: y,
      }));

    performanceLoader.subscribe(() => {});

是否有解决方法,以便在服务而不是组件中调用finalize?

2 个答案:

答案 0 :(得分:4)

当您调用可观察对象的管道函数时,它不会使可观察对象发生变化。而是返回一个新的可观察值。因此,您应该将obs设置为obs.pipe(),如下所示:

searchWithLoader(obs: Observable<any>) {
   this.show();
   return obs.pipe(finalize(() => {
      console.log("FINALIZE NOT CALLED");
      this.hide();
   }));      
}

答案 1 :(得分:1)

您的代码

 this.performanceDataService.getSomething({
        x: x,
        y: y,
      }))

这不是可观察的,将其传递给searchWithLoader函数时必须是可观察的。除非您可以显示getSomething的代码,否则我们可以为您提供更多帮助