根据此主题: What is the difference between Promises and Observables?
许多用户说Observable就像一个流。 我真的很难理解,例如这个端点有多特别:
https://jsonplaceholder.typicode.com/posts
可以随时间返回许多值。 由于它是http请求,因此无论成功还是失败,都将返回单个响应。
答案 0 :(得分:2)
您是正确的,将http请求与可观察对象一起使用时,它仍然只会返回单个事件。因此,如果您正在执行的唯一异步操作是单个http请求,则使用可观察变量而不是应许变量不会带来任何好处。
当您开始将几个可观察的流组合在一起时,RxJS和可观察的功能将发挥作用。可以使用诸如mergeMap,switchMap,forkJoin,combinateLatest等操作符来完成此操作。当您开始执行此操作时,将http请求作为可观察对象可以得到很多好处。
以轮询为例,创建一个事件流,该事件流每10秒触发一次,然后使用http请求对服务器进行轮询,这是一个使用带有可观察对象的http请求确实很出色的用例。
答案 1 :(得分:1)
当我们想随着时间的推移管理和/或合并多个事件时,可观察的对象很有用。
假设我们有一个方法将为该JSON返回承诺:
.my-toolbar{
--background: var(--ion-color-primary);
}
此外,假设我们正在跟踪当前页面上的用户状态:
const dataPromise = fetchData('https://jsonplaceholder.typicode.com/posts');
现在让我们为数据获取和用户离开事件绘制时间表。 const userLeavePromise = trackUserPresence();
代表事件,及时发生:
o
举例来说,数据将在第4秒钟获取,而我们烦躁不安的用户将在第3秒钟离开页面。在这种情况下,我们要取消获取操作和所有后处理回调(以Promise的话,所有 1s 2s 3s 4s 5s
data ------------o
userLeave --------o
-ned函数)。
对于这种情况(以及更多情况),RxJS提供了许多运算符,这些运算符使我们可以随时间组合事件。
在这种情况下,我们将获取数据,直到用户离开页面:
.then
答案 2 :(得分:1)
将HTTP请求与Promise和Observable进行比较并没有太大区别,因为Observable一旦完成请求就完成,因此它不是长寿的Observable。但是,每次您单击该按钮时,都会发出以下提示。
const { fromEvent } = rxjs;
fromEvent(document.getElementById('clickMe'), 'click').subscribe(() => {
console.log('clicked button');
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.4.0/rxjs.umd.min.js"></script>
<button id="clickMe">Click me</button>