在Angular中Promise和Observable之间有什么区别?

每一个例子都有助于理解这两种情况。在什么情况下,我们可以使用每种情况?


当前回答

Promise和Observables将帮助我们使用JavaScript中的异步功能。它们在许多情况下非常相似,但是,两者之间仍然存在一些差异,承诺是以HTTP调用等异步方式解析的值。另一方面,可观测性处理一系列异步事件。它们之间的主要区别如下:

承诺:

有一条管道通常仅用于异步数据返回不容易取消

可观察:

可取消本质上是可重新测试的,例如重试和retryWhen多个管道中的流数据具有类似数组的操作,如map、filter等可以从其他来源(如事件)创建它们是功能,稍后可以订阅

此外,我为您创建了下图,以直观地显示差异:

其他回答

简短回答:

可观察性更好。它具有所有Promise功能和额外功能。


长答案:

承诺:

一次性使用“返回数据一次”不取消一位听众无插座支持

观察结果:

数据更改时多次返回数据支持取消支撑插座支持许多侦听器,并在数据更改时通知它们支持映射、过滤和减少

许诺

Promise在异步操作完成或失败时处理单个事件。

注意:有Promise库支持取消,但ES6 Promise目前还没有。

可观察的

Observable就像一个流(在许多语言中),允许传递零个或多个事件,并为每个事件调用回调。

与Promise相比,Observable通常更受欢迎,因为它提供了Promise等特性。使用Observable,无论您想处理0、1或多个事件。您可以在每种情况下使用相同的API。

Observable也比Promise具有可取消的优势。如果不再需要对服务器的HTTP请求或其他昂贵的异步操作的结果,则Observable的Subscription允许取消订阅,而Promise最终将调用成功或失败回调,即使您不再需要通知或它提供的结果。

当Promise立即启动时,Observable只有在您订阅它时才会启动。这就是为什么Observable被称为lazy。

Observable提供了map、forEach、reduce等运算符。。。类似于阵列

还有一些强大的运算符,如retry()或replay()。。。这通常很方便。rxjs附带的操作员列表

惰性执行允许在通过订阅执行可观察到的操作之前建立一个运算符链,以进行更具声明性的编程。

还有一个区别:全球与进口

Promise是一个标准的内置对象,您可以直接使用它。在此处检查浏览器支持。

const myPromise=新Promise((解析,拒绝)=>{setTimeout(()=>{解决(“无需安装即可”);}, 300);});我的承诺.then(值=>{console.log(值)}).catch(错误=>{console.log(错误)});

JavaScript的可观察、反应式扩展需要RxJS安装和导入才能使用

import { Observable } from 'rxjs';

我总结了以下差异,

可观察:

Observable只是一个函数,它接受一个观察者并返回一个函数observer:一个带有下一个错误的对象。Observer允许订阅/取消订阅其数据流,发出下一个值,通知观察者错误和通知观察者流完成情况Observer提供了一个函数来处理下一个值、错误和流结束(UI事件、http响应、带有web套接字的数据)。随着时间的推移使用多个值它可以取消/重试,支持map、filter、reduce等运算符。创建Observable可以是-Observable.create()-返回可在-ObservatorObservable.from()-将数组或可迭代对象转换为-ObservableObservable.fromEvent()-将事件转换为Observable-Observable.fromPromise()-将Promise转换为Observable-Observable.range()-返回指定范围内的整数序列

承诺:

一个承诺代表着一项未来将完成的任务;承诺通过价值来解决;承诺被例外拒绝;不可取消,并返回单个值承诺暴露函数(然后)-然后返回一个新的承诺;-允许基于状态-处理程序保证按照所附的顺序执行;

关于这个话题已经有很多答案了,所以我不会再赘述。

但是对于刚开始学习Observable/Aangular并想知道与Promise相比使用哪一个的人来说,我建议您将所有内容都保持Observable,并将项目中所有现有的Promise转换为Observable。

因为Angular框架本身及其社区都在使用Observable。因此,当您集成框架服务或第三方模块并将所有内容链接在一起时,这将是有益的。


当然,没有任何意见在所有情况下都是100%正确的,但至少我认为98%的时间是在Angular框架中实现的常规商业项目,Observable是正确的选择。

即使你在开始你的简单爱好项目时不喜欢它,你很快就会意识到你在Angular中与之交互的几乎所有组件,而且大多数Angular友好的第三方框架都使用Observables,然后你会不断地将Promise转换为Observable,以便与它们进行通信。

这些组件包括但不限于:HttpClient、表单生成器、Angular材质模块/对话框、Ngrx存储/效果和ngx引导。

事实上,我在过去两年中处理的Angular生态系统中唯一的Promise是APP_INITIALIZER。