angular - 如何取消订阅我的应用程序中的所有订阅?
问题描述
我有一个很大的应用程序,其中有很多订阅方法。如果我想退订其中一个,那么我将使用以下代码:
getUsersSubscription: Subscription;
ngOnInit() : void {
this.getUsersSubscription = this.userService().subscribe(users => {
...something
})
}
ngOnDestroy() : void {
this.getUsersSubscription.unsubscribe();
}
问题是我有很多页面 - 也有组件。我有 jwt 令牌,当它过期时,我正在注销用户。问题是当我这样做时,一些电话仍在发生......我如何在注销后取消订阅我的应用程序中的所有内容,所以我不需要通过页面中的所有组件对我的所有订阅重复此步骤?
此外,我正在使用拦截器来捕获该 jwt 到期,并将用户重定向到登录页面。但是,如果用户单击某些内容,登录页面中仍然会进行调用 - 在他注销前几秒钟
解决方案
如果你需要取消订阅很多Observable
,你应该使用一个Subscription
数组:
private subscriptions: Subscription[] = [];
ngOnInit() {
this.subscriptions.push(this.userService.subscribe(users => {
...something
}));
}
ngOnDestroy() {
this.subscriptions.forEach(subscription => subscription.unsubscribe());
}
但我认为您真正的问题是您的订阅量可能比您需要的多。
首先,您应该尽可能使用async
管道。它可以很好地免费处理订阅和取消订阅。
另外,请注意,您通常不需要取消订阅冷的 observables(如 由 返回的那些HttpClient
),因为当 http 请求完成时,observable 会终止。您只需取消订阅具有副作用的冷可观察对象。
推荐阅读
- intellij-idea - intellij idea 结帐错误:doenst 显示“svn 结帐选项”对话框?
- kotlin - Kotlin 的 fold 是什么让我可以将操作函数放在右括号之后?
- google-cloud-platform - 谷歌云实例显示 SSH 而不是 RDP(Windows 而不是 Linux)
- javascript - 更新到 Codeigniter 3.x 后,为什么在 ajax 调用期间出现 json 解析错误?
- ruby-on-rails - 显示多行错误消息
- mysql - 从 db 表中获取行
- reactjs - 我可以在不违反 React 设计原则的情况下在 reducer 中验证令牌吗?
- java - 为什么java支持255维数组,而在现实生活中我们很少超过2D?
- python - Python Pong Game在1后没有增加点
- f# - F# - 以微秒为单位的时间转换为星期几