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

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


当前回答

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

承诺在应用程序中自动执行,而可观测则是惰性的。所以我们必须订阅可观测值以返回数据。

我们不能取消订阅承诺。与可取消订阅的Observables相比,它们每次都会执行。

其他回答

承诺:

提供单一的未来价值;不懒惰;不可撤销;

可观察:

随时间推移发出多个值;懒惰的可取消;支持map、filter、reduce和类似运算符

如果愿意,可以在Angular中调用HTTP时使用promise而不是observables。

Promise和Observables都只处理异步调用。

以下是它们之间的区别:

可观察的

在一段时间内发出多个值在我们订阅Observable之前不会调用可以使用unsubscribe()方法取消提供映射、forEach、filter、reduce、retry和retryWhen运算符

许诺

一次仅发射一个值调用不带.then和.catch的服务无法取消不提供任何操作员

我看到很多人认为Observable是“可取消的”,但将Promise设为“可取消”并不重要

函数cancelablePromise(主体){让决心,拒绝;const promise=新的promise((res,rej)=>{分辨率=res;拒绝=rej;正文(解析,拒绝)})promise.resolve=决议;promise.reject=拒绝;退货承诺}//示例1:过早拒绝承诺const p1=可取消承诺((resolve,reject)=>{setTimeout(()=>解析(“10”,100))})p1.then(value=>alert(value)).catch(err=>console.error(err))p1.拒绝(新错误('denid'))//控制台中出现错误//示例:过早地解决承诺const p2=可取消承诺((resolve,reject)=>{setTimeout(()=>解析('blop'),100)})p2.then(value=>alert(value)).catch(err=>console.error(err))p2.resolve(200)//预期警报为200

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

但是对于刚开始学习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。

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

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

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

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

import { Observable } from 'rxjs';