发布于 2026-01-06 0 阅读
0

始终取消订阅,没有例外。讨论结束。

始终取消订阅,没有例外。讨论结束。

使用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
即将迎来重大更新(抢先体验)

文章来源:https://dev.to/this-is-angular/always-unsubscribe-no-exceptions-debate-lined-205n