我一直在寻找一种简单的方法来避免我读到的由于取消订阅失败而导致的内存泄漏。大多数时候我只是想从我的后端得到一个响应。然后我想退订。那么为什么不在回调中调用它呢?
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;
}
注意对局部变量的订阅赋值。然后这个局部变量被锁定在一个闭包中,并被告知在它的工作完成后取消订阅。没有类变量,没有 takeUntil,没有别的。
它编译并运行没有错误。我对调试器不够熟悉,无法确定可观察对象是否实际被销毁并随后被垃圾收集。
有什么我想念的吗?更熟悉调试器的人可以纠正我吗?因为如果这行得通,我将在任何地方都这样做。除了在我的 pollWords() 函数中...
这似乎比我见过的其他解决方案要简单得多。我认为我什至不需要闭包,因为当我在调试器中查看它时,我看到“_this”是“this”的闭包,而“this”实际上是可观察的。因此,如果有某种方法可以防止发生在“this”上的修改,那么我可以调用“this.unsubscribe()”并完成。并不是说对象引用闭包是一件可怕的事情......
引用资料:
最佳答案
做你想做的事情的一种更像 RxJS 的方式是使用 take
运算符,像这样:
this.puzzleService.login(this.nameoremail, this.password).pipe(
take(1)
).subscribe(success => {
// ...
});
这将使可观察对象恰好发出一个值,然后完成它。
但是,@Picci 是完全正确的,如果您的 login
方法从 HttpClient
请求返回结果,您不需要手动取消订阅(也不需要使用 拿
,就此而言)。
关于angular - 在订阅回调函数中取消订阅?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53216501/