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

在 Angular 中,你不一定非要使用 Observables。

在 Angular 中,你不一定非要使用 Observables。

在 Angular 中,您可以通过两种不同的方式执行异步操作:Observables 和 Promise。

大多数人选择 Observables 是因为博客和文档上的示例都建议这样做。但为什么呢?Promise 真的那么糟糕吗?还是 Observables 真的那么好?

在这篇文章中,我想和大家深入探讨一下为什么!为什么以及何时应该使用 Observables,而何时 Promise 就足够了。

我们先来比较一下这两者。

分割线-byrayray.png

可观测值与承诺

我们先从可观察对象开始。

可观测变量

Angular底层使用了RxJS。RxJS提供了一系列强大的功能,例如Observables(可观察对象)。

与 Promise 相比,Observable 可以执行异步和同步操作。Promise 只能执行异步操作。

当 Observable 被创建时,它不会执行任何操作,直到有代码决定订阅它。您可以取消对 Observable 的订阅,或者当发生错误时,订阅会自动取消。

可观察对象处理数值流,并在稍后某个时间点快速更新。

总结起来:

可观察行为

  • 多重值
  • 可以取消
  • 非常适合获取实时信息
  • 可从多个渠道订阅
  • 错误自动取消订阅
  • 可观察对象是声明式的。它们只有在被订阅时才会执行。
  • 具备对数据进行转换的内置机制(map、forEach、filter、reduce、retry 和 retryWhen 操作符)
  • 可以是异步的,也可以是同步的。

承诺

Promise 是 JavaScript 自 ES2015 (ES6) 起引入的一个通用概念。它非常适合执行异步操作。与 Observable 不同,Promise 没有订阅者。

Promise 不能像 Observable 那样被取消。它只能被解决或拒绝,仅此而已。它只能处理单个值,而不能处理值流。

Promise是在创建时执行的,而不是像Observables那样在订阅时执行。

如果你想了解更多关于 Promises 的内容,可以查看我之前写的一篇更详细的文章。

总结起来:

承诺行为

  • 单值
  • 无法取消
  • 非常适合一次性信息
  • 不能重复使用或分发信息
  • 承诺是在创造中履行的
  • 始终是异步的

分割线-byrayray.png

何时使用 Promise 或 Observable?

正如我们之前看到的,Promise 和 Observable 之间最显著的区别在于处理单个值和处理值流。

使用 Observable

可观测对象非常适合数据在其生命周期内发生变化的情况。

适用情况

  • 例如,来自 WebSocket 的实时数据。想想仪表盘、聊天消息、通知、视频字幕、声音可视化。
  • 或者用户经常执行的操作。例如,可折叠菜单、深色和浅色模式。

这些情况要求数据在短时间内更新,至少在订阅的有效期内需要如此。

使用承诺

由于 Promise 可以处理单个值,因此它在很多情况下都适用。

适用情况

  • 表单提交:创建、编辑和删除数据实体不需要持续更新数据流。表单数据会发送到 API;只有成功或失败两种结果。
  • 用于获取非实时变化数据的 API 请求:例如,用于显示概览页面或详情页面的大量数据。

所有这些情况都不需要数据频繁更新。数据通过 API 调用收集、显示,然后就完成了。就这么简单。

分割线-byrayray.png

为什么大家都在用可观察对象来做所有事情?

这让我不禁要问:“为什么大家都在用 Observables 来做所有事情呢?”

是的,我自己也犯过这个错误!我曾经使用 Observable 发送过单个请求。有必要吗?没有必要!

如果 Observable 生命周期内数据没有变化,却仍然保持订阅开启状态,这并非正确使用浏览器的功能。此外,大多数开发者(包括我自己)经常会忘记取消订阅 Observable。

我的经验法则是:“如果不需要,就不要包含或使用它!

我们不应浪费资源,而应物尽其用。

分割线-byrayray.png

总结

好的,我们尽量简化一下,方便大家理解。

对于实时或在其生命周期内频繁变化的数据,请使用 Observable。不要浪费资源!如果数据在组件生命周期内保持不变,请使用 Promise!

可能是我理解错了或者没理解你的意思😅。请问您能否在评论区告诉我我漏掉了什么?

分割线-byrayray.png

谢谢!

hashnode-footer.png
希望你读完这个故事后有所收获,或者受到启发去创作一些新的东西!🤗 如果是这样,欢迎通过电子邮件订阅(滚动到页面顶部)或在 Hashnode 上关注我

你知道吗?你也可以自己创建一个像这样的开发者博客!完全免费!👍💰🎉🥳🔥

如果你还有疑问或想回复我,请向下滚动并给我留言。如果你想私下交流,请在推特上给我发私信,我的账号是 @DevByRayRay 。我的私信永远开放哦😁

文章来源:https://dev.to/devbyrayray/you-don-t-have-to-use-observables-in-angular-1653