我正在尝试了解 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()
行为。
答案 0 :(得分:2)
share
是publish().refCount()
的快捷方式。 refCount
- 部分意味着,只要有至少1个订户,流就是热/共享的 - 如果没有订户,它将被重置/冷。当您的ajax
- 请求完成时,流完成,并且在完成流后,任何订户都将自动取消订阅 - >将流的子驱动程序设置为0并因此重置流 - 这就是为什么您在将来订阅时遇到第二次网络任务的原因。
为什么这适用于publishLast().refCount()
? - 使用publishLast()
,您将获得一个永不完成的流,因此没有订阅者自动取消订阅,并且流永远不会被重置。
对于缓存HTTP响应,您使用publishLast().refCount()
的方法完全有效。