我一直在寻找一种简单的方法来避免由于未取消订阅而导致的内存泄漏。大多数时候,我只希望后端提供一个响应。然后,我想退订。那么为什么不在回调中调用它呢?
onSubmit(){
var subscription = this.puzzleService.login(this.nameoremail, this.password).subscribe( success =>{
if(success){
this.router.navigate(['/puzzles']);
}
else{
this.message="Login failed. Please try again.";
}
this.loading=false;
subscription.unsubscribe();
});
this.loading=true;
}
Run Code Online (Sandbox Code Playgroud)
请注意将订阅分配给局部变量。然后,将该局部变量锁定在闭包内部,并告知其完成工作时退订。没有类变量,没有takeUntil,仅此而已。
它编译并运行没有错误。我对调试器还不太熟悉,无法确定可观察对象是否实际销毁并随后进行了垃圾回收。
有什么我想念的吗?可以更熟悉调试器的人纠正我吗?因为如果这行得通,我将在所有地方都这样做。除了我的pollWords()函数中...
这似乎比我所提倡的其他解决方案简单得多。我想我甚至根本不需要关闭,因为当我在调试器中查看它时,我看到“ _this”是“ this”的关闭,而“ this”实际上是可观察的。因此,如果有某种方法可以防止“ this”发生麻烦,那么我可以调用“ this.unsubscribe()”并完成操作。并不是说对象引用关闭是一件可怕的事情……
参考文献:
一种更类似于RxJS的操作方式是使用take运算符,如下所示:
this.puzzleService.login(this.nameoremail, this.password).pipe(
take(1)
).subscribe(success => {
// ...
});
Run Code Online (Sandbox Code Playgroud)
这将使可观察对象恰好发出一个值,然后完成该值。
但是,@ Picci是完全正确的,如果您的login方法返回了HttpClient请求的结果,则无需手动退订(take就此而言,也无需使用)。
取消订阅对于避免内存泄漏很重要,但是如果您“只是想从后端获得一个响应”,那么取消订阅就不是那么重要。
我的意思是,如果在您this.puzzleService.login使用Angular http服务之后,您不必担心取消订阅,因为该服务本身会在从后端获得响应或发生错误时立即取消订阅。
当您遇到可观察的流时,取消订阅很重要,该流本质上发出多个值,这不是http调用的情况,而是Web套接字流或其他类型的流的情况。
来自Ben Lesh的这篇文章(如果不是RxJS的主要负责人)将为该主题提供一些启示。
| 归档时间: |
|
| 查看次数: |
3555 次 |
| 最近记录: |