了解 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()
上述情况下的行为。
share
是 publish().refCount()
的快捷方式。 refCount
部分意味着,只要至少有 1 个订阅者,流就是 hot/shared - 然而,当没有订阅者时它是 reset/cold。当您的 ajax
-requests 完成时,流完成并且流完成后任何订阅者都会自动取消订阅 -> 将流的订阅者设置为 0 并因此重置流 - 这就是为什么你会遇到第二次network-quest 任何未来的订阅。
为什么这适用于 publishLast().refCount()
? - 使用 publishLast()
你会得到一个永远不会完成的流,因此没有订阅者会自动取消订阅并且流永远不会被重置。
对于缓存 HTTP-Responses 你使用 publishLast().refCount()
的方法是完全有效的。
我试图理解 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()
上述情况下的行为。
share
是 publish().refCount()
的快捷方式。 refCount
部分意味着,只要至少有 1 个订阅者,流就是 hot/shared - 然而,当没有订阅者时它是 reset/cold。当您的 ajax
-requests 完成时,流完成并且流完成后任何订阅者都会自动取消订阅 -> 将流的订阅者设置为 0 并因此重置流 - 这就是为什么你会遇到第二次network-quest 任何未来的订阅。
为什么这适用于 publishLast().refCount()
? - 使用 publishLast()
你会得到一个永远不会完成的流,因此没有订阅者会自动取消订阅并且流永远不会被重置。
对于缓存 HTTP-Responses 你使用 publishLast().refCount()
的方法是完全有效的。