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
来获得相同的结果(我会推荐 switchMap
或 concatMap
以防请求花费的时间超过你的轮询间隔)但也让错误传播到顶部 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 sub
与 this.sub
相同,您的原始代码应该没问题。
以下代码有一个计时器和一个获取请求。如果请求 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
来获得相同的结果(我会推荐 switchMap
或 concatMap
以防请求花费的时间超过你的轮询间隔)但也让错误传播到顶部 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 sub
与 this.sub
相同,您的原始代码应该没问题。