【问题标题】:Finalize operator not called when wrapped包装时未调用终结运算符
【发布时间】:2026-02-12 22:20:05
【问题描述】:

我正在使用 Angular 服务来包装我的一些 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?

【问题讨论】:

    标签: angular rxjs


    【解决方案1】:

    当您调用可观察对象的管道函数时,它不会改变可观察对象。相反,它返回一个新的 observable。所以你应该将 obs 设置为 obs.pipe() 如下所示

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

    【讨论】:

    • 你甚至可以只返回 obs.pipe() 并删除底部的返回行。
    【解决方案2】:

    你的代码

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

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

    【讨论】:

    • getSomething 是由 raml 文件生成的 API 调用,因此您可以 100% 将其视为可观察对象