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

Understanding the share() RxJS operator in action together with Rx.Observable.ajax

我试图理解 RxJS 5 share() 运算符的行为。

根据教程和文档,share() 将冷 observable 变成热 observable。

我正试图在行动中看到这一点。这是我尝试过的:

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() 运算符显示此行为吗?我原以为只发出一个网络请求...

P.S. 使用 xxx.publishLast().refCount(); 而不是 xxx.share(); 可以完成这项工作,但我主要关心的是理解 share()上述情况下的行为。

sharepublish().refCount() 的快捷方式。 refCount 部分意味着,只要至少有 1 个订阅者,流就是 hot/shared - 然而,当没有订阅者时它是 reset/cold。当您的 ajax-requests 完成时,流完成并且流完成后任何订阅者都会自动取消订阅 -> 将流的订阅者设置为 0 并因此重置流 - 这就是为什么你会遇到第二次network-quest 任何未来的订阅。

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


对于缓存 HTTP-Responses 你使用 publishLast().refCount() 的方法是完全有效的。