【问题标题】:RxJS 5 - finally, finalize, complete, none worksRxJS 5 - 最后,完成,完成,没有工作
【发布时间】:2019-11-22 07:27:00
【问题描述】:

我有一个简单的订阅,我想在最后执行一些逻辑(在错误和成功的情况下,这就是为什么我需要最终/完整的行为)。订阅如下所示:

this.service.call(x)
 .subscribe(response => {
     ...
  }, (error: HttpErrorResponse) => {
     ...
  });

奇怪的是我没有得到最后的工作..我已经尝试了很多建议,比如

  • finally(() => ...) 在 .subscribe 之前

  • pipe(finalize()...) 在 .subscribe 之前

  • 3.当前订阅函数中的回调..(完成)

  • .add(() => { }); .subscribe 之后

到目前为止,他们都没有为我工作。我该怎么办?

奇怪的调用函数的内容(外部依赖):

  public readDetails(id: string): Observable<Details> {
    return new Observable<Details>(subscriber => {
      this.appConfig.getEndpoint('details').subscribe(
        (endpoint: Endpoint) => {
          const url = `${endpoint.toUrl()}/${id}`;
          const headers = new HttpHeaders({
            ...
          });
          this.http.get<Details>(url, {headers})
            .subscribe(
              (response: Details) => {
                subscriber.next(response);
              },
              (error) => {
                subscriber.error(error);
              }
            );
        },
        error => subscriber.error(error)
      );
    });
  }

【问题讨论】:

  • 您确定call() 完成了吗?你能分享call()的代码吗?
  • 实际上当我让方法保持原样时,我的订阅(或错误函数)被调用,并且应用程序正常工作..我将编辑调用函数内容的问题
  • finally 回调被调用... finally,即当流完成或出错时。如果它是一个无限流,finally 回调将永远不会被调用。如果您添加了一个完整的回调并且它从未被调用,这意味着您的流是无限的(或者至少您没有等待足够长的时间来看到它完成)。
  • readDetails 函数应该如何/应该返回一个完成?

标签: angular rxjs rxjs5


【解决方案1】:

回应您的评论 (comments-57008755),

rxJs v5.5之前,它被称为'finally'。

从 v5.5 开始,它被重命名为“finalize”(由于关键字限制),因为引入了有助于摇树的可管道操作符。

请参阅 (here) 了解来源信息。

【讨论】:

    【解决方案2】:

    您的自定义 observable 永远不会完成,因此您的 finally 回调永远不会被调用。

    你不应该创建一个自定义的 observable 来链接两个调用。相反,学习使用 RxJS 操作符。我将在这里使用 RxJS 6 语法,因为 RxJS 5 已过时,但翻译应该不难:

    return this.appConfig.getEndpoint('details').pipe(
      switchMap(endpoint => {
        const url = `${endpoint.toUrl()}/${id}`;
        const headers = new HttpHeaders({
            ...
        });
        return this.http.get<Details>(url, {headers});
      });
    });
    

    【讨论】:

    • 谢谢..我已经覆盖了我的serviceCall..我仍然没有得到最终的工作..我有错误“finally is not a function”..我也试过3。订阅中的参数(完整部分),它也没有被调用..也用finalize..管道:/
    • 我会写另一个问题..也许我应该用另一种方式来阐述主要问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 2014-07-17
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多