在Angular中Promise和Observable之间有什么区别?
每一个例子都有助于理解这两种情况。在什么情况下,我们可以使用每种情况?
在Angular中Promise和Observable之间有什么区别?
每一个例子都有助于理解这两种情况。在什么情况下,我们可以使用每种情况?
当前回答
许诺
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附带的操作员列表
惰性执行允许在通过订阅执行可观察到的操作之前建立一个运算符链,以进行更具声明性的编程。
其他回答
我总结了以下差异,
可观察:
Observable只是一个函数,它接受一个观察者并返回一个函数observer:一个带有下一个错误的对象。Observer允许订阅/取消订阅其数据流,发出下一个值,通知观察者错误和通知观察者流完成情况Observer提供了一个函数来处理下一个值、错误和流结束(UI事件、http响应、带有web套接字的数据)。随着时间的推移使用多个值它可以取消/重试,支持map、filter、reduce等运算符。创建Observable可以是-Observable.create()-返回可在-ObservatorObservable.from()-将数组或可迭代对象转换为-ObservableObservable.fromEvent()-将事件转换为Observable-Observable.fromPromise()-将Promise转换为Observable-Observable.range()-返回指定范围内的整数序列
承诺:
一个承诺代表着一项未来将完成的任务;承诺通过价值来解决;承诺被例外拒绝;不可取消,并返回单个值承诺暴露函数(然后)-然后返回一个新的承诺;-允许基于状态-处理程序保证按照所附的顺序执行;
Promise和Observable都在Angular(typescript)中用于处理异步数据,但它们的用法和行为不同。
承诺:是一次性事件(解决/拒绝)返回单个值(解析或拒绝一次)处理单个异步事件无取消和无插座
用例示例:错误处理和恢复/处理顺序操作/组件间通信
import { HttpClient } from '@angular/common/http';
constructor(private http: HttpClient) {}
fetchData() {
return new Promise((resolve, reject) => {
this.http.get('https://api.examplepromise.com/data')
.toPromise()
.then(data => resolve(data))
.catch(error => reject(error));
});
}
观察结果:一段时间内可以发出多个值的值流只要流处于活动状态,就可以订阅并发出值。处理多个异步事件可以取消并支持socket/mapreducer(ngrx)操作用例示例:监控输入元素的变化/动画和转换/使用RxJS进行集中状态管理/取消用户输入以限制API调用
块引用
import { fromEvent } from 'rxjs';
constructor(private elementRef: ElementRef) {}
listenToButtonClicks() {
fromEvent(this.elementRef.nativeElement, 'click')
.subscribe(event => console.log(event));
}
承诺:
提供单一的未来价值;不懒惰;不可撤销;
可观察:
随时间推移发出多个值;懒惰的可取消;支持map、filter、reduce和类似运算符
如果愿意,可以在Angular中调用HTTP时使用promise而不是observables。
在第一次阅读教程和文档时,我遇到了一个不明显的问题,那就是多播的想法。
确保您知道默认情况下,多个订阅将触发Observable中的多个执行。对单个HTTP调用的多个订阅Observable将触发多个相同的HTTP调用,除非您.share()(启用多播)。
一个承诺迫使你一次处理一件事,解开它的数据,处理异常,对async/await等很酷的事情有语言支持,否则就很简单了。
Observable有很多钟和哨子,但你需要了解你正在使用的力量,否则它可能被滥用。
承诺-提供单一的未来价值。不懒惰。无法取消。它要么拒绝,要么解决。
可观察-提供多个未来值。懒惰的可取消。它提供了其他方法,如map、filter和reduce。