在 Angular 中,你不一定非要使用 Observables。
在 Angular 中,您可以通过两种不同的方式执行异步操作:Observables 和 Promise。
大多数人选择 Observables 是因为博客和文档上的示例都建议这样做。但为什么呢?Promise 真的那么糟糕吗?还是 Observables 真的那么好?
在这篇文章中,我想和大家深入探讨一下为什么!为什么以及何时应该使用 Observables,而何时 Promise 就足够了。
我们先来比较一下这两者。
可观测值与承诺
我们先从可观察对象开始。
可观测变量
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 的内容,可以查看我之前写的一篇更详细的文章。
总结起来:
承诺行为
- 单值
- 无法取消
- 非常适合一次性信息
- 不能重复使用或分发信息
- 承诺是在创造中履行的
- 始终是异步的
何时使用 Promise 或 Observable?
正如我们之前看到的,Promise 和 Observable 之间最显著的区别在于处理单个值和处理值流。
使用 Observable
可观测对象非常适合数据在其生命周期内发生变化的情况。
适用情况
- 例如,来自 WebSocket 的实时数据。想想仪表盘、聊天消息、通知、视频字幕、声音可视化。
- 或者用户经常执行的操作。例如,可折叠菜单、深色和浅色模式。
这些情况要求数据在短时间内更新,至少在订阅的有效期内需要如此。
使用承诺
由于 Promise 可以处理单个值,因此它在很多情况下都适用。
适用情况
- 表单提交:创建、编辑和删除数据实体不需要持续更新数据流。表单数据会发送到 API;只有成功或失败两种结果。
- 用于获取非实时变化数据的 API 请求:例如,用于显示概览页面或详情页面的大量数据。
所有这些情况都不需要数据频繁更新。数据通过 API 调用收集、显示,然后就完成了。就这么简单。
为什么大家都在用可观察对象来做所有事情?
这让我不禁要问:“为什么大家都在用 Observables 来做所有事情呢?”
是的,我自己也犯过这个错误!我曾经使用 Observable 发送过单个请求。有必要吗?没有必要!
如果 Observable 生命周期内数据没有变化,却仍然保持订阅开启状态,这并非正确使用浏览器的功能。此外,大多数开发者(包括我自己)经常会忘记取消订阅 Observable。
我的经验法则是:“如果不需要,就不要包含或使用它! ”
我们不应浪费资源,而应物尽其用。
总结
好的,我们尽量简化一下,方便大家理解。
对于实时或在其生命周期内频繁变化的数据,请使用 Observable。不要浪费资源!如果数据在组件生命周期内保持不变,请使用 Promise!
可能是我理解错了或者没理解你的意思😅。请问您能否在评论区告诉我我漏掉了什么?
谢谢!

希望你读完这个故事后有所收获,或者受到启发去创作一些新的东西!🤗 如果是这样,欢迎通过电子邮件订阅(滚动到页面顶部)或在 Hashnode 上关注我
。
你知道吗?你也可以自己创建一个像这样的开发者博客!完全免费!👍💰🎉🥳🔥
如果你还有疑问或想回复我,请向下滚动并给我留言。如果你想私下交流,请在推特上给我发私信,我的账号是 @DevByRayRay 。我的私信永远开放哦😁
文章来源:https://dev.to/devbyrayray/you-don-t-have-to-use-observables-in-angular-1653




