理解与Rx.Observable.ajax一起使用的share()RxJS运算符

时间:2017-02-03 13:38:48

标签: rxjs rxjs5

我正在尝试了解 RxJS 5 share()运算符的行为。

根据教程和文档,share()将寒冷的观察结果转变为热点。

我试图看到这一点。这是我尝试过的:

const search$ = Rx.Observable.ajax('https://www.googleapis.com/books/v1/volumes?q=javascript').share();

然后我第一次订阅它:

search$.subscribe(console.log);

我从开发工具中看到发出了网络请求:

 Request URL:https://www.googleapis.com/books/v1/volumes?q=javascript

然后重新运行相同的订阅:

search$.subscribe(console.log);

我注意到还发出了另一个网络请求

有人可以解释一下share()运算符显示此行为的原因吗?我期待只发出一个网络请求......

使用xxx.publishLast().refCount();代替xxx.share();

P.S。可以胜任这项工作,但主要关注的是了解上述背景下的share()行为。

1 个答案:

答案 0 :(得分:2)

sharepublish().refCount()的快捷方式。 refCount - 部分意味着,只要有至少1个订户,流就是热/共享的 - 如果没有订户,它将被重置/冷。当您的ajax - 请求完成时,流完成,并且在完成流后,任何订户都将自动取消订阅 - >将流的子驱动程序设置为0并因此重置流 - 这就是为什么您在将来订阅时遇到第二次网络任务的原因。

为什么这适用于publishLast().refCount()? - 使用publishLast(),您将获得一个永不完成的流,因此没有订阅者自动取消订阅,并且流永远不会被重置。

对于缓存HTTP响应,您使用publishLast().refCount()的方法完全有效。