Angular 可观察订阅可以在内部订阅中取消订阅吗?

Angular observable subscription can it be unsubscribed within an inner subscription?

以下代码有一个计时器和一个获取请求。如果请求 returns 错误,计时器应该停止。您可以在内部订阅(即请求)中停止计时器吗?任何潜在的内存泄漏?这是一个好习惯吗?

let sub = timer(500, 1000).subscribe(() => {
  this.http.get<any>(url).subscribe(result => {
    //...
  }, error => {
    //...
    sub.unsubscribe();  // can this be done here?
  });
});
  • Can you stop the timer within the inner subscription

是的,你可以。

  • Any potential memory leaks

只不过是在您的 ngOnDestroy 中取消订阅。无法代表您的其余代码,所以我不会说 "yes" 或 "no"。

  • Is it a good practice

不好也不坏,这里就是代码。我认为您没有其他解决方案,也许可以使用 websocket 来简化代码,但仅此而已。

您拥有的代码使得cleanup/track一切变得更加困难,因为订阅会触发另一个订阅。

你实际上可以使用 mergeMap 来获得相同的结果(我会推荐 switchMapconcatMap 以防请求花费的时间超过你的轮询间隔)但也让错误传播到顶部 Observable:

let sub = timer(500, 1000).pipe(
  switchMap(_ => this.http.get(url))
).subscribe(result => {
  ...
}, error => {
    // sub is already unsubscribed at this point since there was an error
});

回答问题:

至于内存泄漏,如果 let subthis.sub 相同,您的原始代码应该没问题。