在Angular中Promise和Observable之间有什么区别?
每一个例子都有助于理解这两种情况。在什么情况下,我们可以使用每种情况?
在Angular中Promise和Observable之间有什么区别?
每一个例子都有助于理解这两种情况。在什么情况下,我们可以使用每种情况?
当前回答
Promise在异步活动完成或失败时发出单个事件。
Observable类似于流(在许多语言中),允许传递至少零个或多个事件,其中每个事件都需要回调。
与Promise相比,Observable通常更受欢迎,因为它提供了Promise等的亮点。使用Observable,您是否需要处理0、1或各种事件并不重要。您可以针对每种情况使用类似的API。
承诺:promise只产生一种价值
例如:
const numberPromise = new Promise((resolve) => {
resolve(5);
resolve(10);
});
numberPromise.then(value => console.log(value));
// still prints only 5
可观察:在一段时间内发出多个值
例如:
const numberObservable = new Observable((observer) => {
observer.next(5);
observer.next(10);
});
numberObservable.subscribe(value => console.log(value));
// prints 5 and 10
我们可以想象一个可观察的流,它在一段时间内发出多个值,对发出的每个项调用相同的回调函数。无论该数据是作为单个值还是作为多个值在某段时间内传输。
承诺:
承诺不是懒惰承诺不能取消
可观察:
可观察就是懒惰。“可观察”是缓慢的。直到我们订阅了它。可以使用unsubscribe()方法取消Observable另外,Observable提供了许多强大的运算符,foreach、filter、reduce、retry、retryWhen等。
角度承诺与可观测
其他回答
承诺只针对单一价值或解决方案。可观测数据是数据流。可观的东西可以取消,但承诺不能取消。
至少对我来说,最鲜为人知的是:
承诺总是异步的,但可观测可以是同步的和异步的。
如果你想详细了解它,我写了一篇关于这个答案的博客文章——JavaScript中Observables和Promise之间的4个区别
Promise和Observables都帮助我们处理异步操作。当这些异步操作完成。Angular使用RxJS中的Observables而不是承诺来处理HTTP
以下是承诺和可观察性的一些重要区别。
我相信所有其他的答案都会消除你的疑虑。然而,我只是想补充一点,可观测性是基于函数式编程的,我发现它附带的函数非常有用,比如map、flatmap、reduce、zip。web实现的一致性,尤其是当它依赖于API请求时,是一种残酷的改进。
我强烈推荐这个文档,因为它是reactiveX的官方文档,我发现它是最清晰的。
如果你想了解可观测性,我建议你写一篇三部分的文章:http://blog.danlew.net/2014/09/15/grokking-rxjava-part-1/
虽然它是针对RxJava的,但概念是相同的,而且解释得很好。在reactiveX文档中,您拥有每个函数的等效项。您必须查找RxJS。
承诺:
提供单一的未来价值;不懒惰;不可撤销;
可观察:
随时间推移发出多个值;懒惰的可取消;支持map、filter、reduce和类似运算符
如果愿意,可以在Angular中调用HTTP时使用promise而不是observables。
我总结了以下差异,
可观察:
Observable只是一个函数,它接受一个观察者并返回一个函数observer:一个带有下一个错误的对象。Observer允许订阅/取消订阅其数据流,发出下一个值,通知观察者错误和通知观察者流完成情况Observer提供了一个函数来处理下一个值、错误和流结束(UI事件、http响应、带有web套接字的数据)。随着时间的推移使用多个值它可以取消/重试,支持map、filter、reduce等运算符。创建Observable可以是-Observable.create()-返回可在-ObservatorObservable.from()-将数组或可迭代对象转换为-ObservableObservable.fromEvent()-将事件转换为Observable-Observable.fromPromise()-将Promise转换为Observable-Observable.range()-返回指定范围内的整数序列
承诺:
一个承诺代表着一项未来将完成的任务;承诺通过价值来解决;承诺被例外拒绝;不可取消,并返回单个值承诺暴露函数(然后)-然后返回一个新的承诺;-允许基于状态-处理程序保证按照所附的顺序执行;