始终取消订阅,没有例外。讨论结束。
使用Angular这么多年了。
使用RxJS这么多年了。
然而,人们仍在争论“何时不应该取消订阅”。
说实话,这根本不值得讨论。
直接取消订阅就行了。就这么简单。
我最近在我的社交媒体(X/LinkedIn)上发布了同样的建议。
虽然大多数人对此表示完全同意,但仍有约10%的人认为这是一个绝佳的机会,可以展示他们深厚的专业知识,即“根本无需总是取消订阅”。
首字母和冠词的例子:
- HttpClient 冷可观察对象
我听说:
- 这是个糟糕的建议
- 每次都要取消订阅,开销很大。
- 人们绝不应该听从这个建议。
- 这完全错误
- 这是冗余代码。
- 这是一个大胆的假设。
- 去问问Angular团队等等……
是的,从技术上讲,HttpClient 在 99% 的情况下都会自动完成。
但这并不意味着你必须刻意寻找并保护你订阅 HttpClient Observable 的地方,以避免取消订阅。
简单的“为什么”:
- 这完全说不通。
- 取消订阅没有任何额外费用,因为你还需要在其他地方取消订阅(这应该是你的本能反应才对,拜托!)
- 重视一致性胜过“耍小聪明”。
- 不要考虑何时取消订阅,专注于重要的事情。
- 价值观一致性……
- 价值观一致性……
还不信服?进阶版“为什么”:
- 引用一位朋友的话,因为我自己无法写得更好:
- 此外,该问题已在 2022 年的某个 GitHub 问题中“悄悄”解决。“工程”部门的反馈指的是开发人员的回复。
来源:https ://github.com/angular/angular/issues/46542
- 最后,在新的 Angular 文档网站上,明确指出:
一旦响应返回,HttpClient 中的 Observable 通常会完成(尽管拦截器可能会影响这一点)。
由于有自动补全机制,即使不清理 HttpClient 订阅,通常也不会出现内存泄漏的风险。但是,与任何异步操作一样,我们强烈建议您在使用订阅的组件销毁时清理订阅,否则订阅回调函数可能会运行,并在尝试与已销毁的组件交互时遇到错误。
来源:https ://angular.dev/guide/http/making-requests#http-observables
如果你的队友一直吹毛求疵地指责你取消订阅 HttpClient Observables,或者他们认为不取消订阅任何其他服务,那么现在你可以利用这个资源了。
提示:尽量避免一开始就使用订阅,尽一切可能最终使用异步管道。
PS:从 Angular v16 开始,取消订阅的最佳方法是使用 takeUntilDestroyed()。
喜欢我的作品吗?请在 LinkedIn 或X上关注我。angularspace.com
即将迎来重大更新(抢先体验)



