RxJS 5-最后,完成,完成,没有用

时间:2019-07-12 13:56:34

标签: angular rxjs rxjs5

我有一个简单的订阅,我想在结尾处执行更多的逻辑(无论是错误案例还是成功案例,这就是为什么我需要一个最终/完整的行为)。订阅看起来像这样:

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

很奇怪,我没有完成最后的工作..我尝试了很多建议,例如

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

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

  • 之前
  • a 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)
      );
    });
  }

2 个答案:

答案 0 :(得分:1)

您的自定义可观察对象永远不会完成,因此永远不会调用您的finally回调。

您不应仅创建可观察的自定义链接两个呼叫。相反,学习使用RxJS运算符。由于RxJS 5已过时,因此我将在这里使用RxJS 6语法,但是翻译不难:

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

答案 1 :(得分:1)

针对您的评论(comments-57008755),

rxJs v5.5之前,它被称为“ 最终”。

从v5.5开始,由于引入了可帮助摇树的管道运算符,因此将其重命名为“ 完成”(由于关键字限制)。

有关来源信息,请参见(here)。