angular - 在订阅回调函数中取消订阅?

标签 angular rxjs

我一直在寻找一种简单的方法来避免我读到的由于取消订阅失败而导致的内存泄漏。大多数时候我只是想从我的后端得到一个响应。然后我想退订。那么为什么不在回调中调用它呢?

  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()”并完成。并不是说对象引用闭包是一件可怕的事情......

引用资料:

Angular/RxJs When should I unsubscribe from `Subscription`

Rxjs Observable Lifecycle

最佳答案

做你想做的事情的一种更像 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/

相关文章:

angular 4 将包含其他对象的对象传递给 FormBuilder.group 函数会导致奇怪的表单行为

javascript - 如何在不使用Js id选择器的情况下动态获取Angular * ngFor中的元素

javascript - 如何从错误处理程序分派(dispatch)操作并立即中断 redux-observable 中 Observable 链的其余部分?

javascript - RxJS:我应该如何通过socket.js事件更新observable中的元素?

angular - 在对话框中重用组件的 Angular 、 Material 的最佳实践?

html - 除非选中复选框,否则禁用按钮(Angular 7+)?

node.js - typescript 无效

javascript - 如何清除 .zip 队列?

RxJS:是否有一个运算符像 mergeScan 一样工作,但只是在外部流发出时取消订阅内部流

javascript - 当没有编写 api 时,如何模拟 Angular2 中的 http observable