2017-02-03 61 views
1

RxJS運營商一起,我試圖瞭解RxJS 5share()運營商的行爲。瞭解份額()的作用與Rx.Observable.ajax

根據教程和文檔,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()運營商顯示此行爲?我期待只發出一個網絡請求...

P.S.使用xxx.publishLast().refCount();而不是xxx.share();完成這項工作,但我主要關心的是瞭解上述情況下的share()行爲。

回答

2

sharepublish().refCount()的快捷方式。 refCount-這意味着,只要有至少1個用戶 - 這個流是熱的/共享的 - 無論如何,當沒有用戶時它將被重置/冷卻。當您的ajax-請求完成時,流完成並且在流完成時,任何訂戶都會自動取消訂閱 - >將流的子訂閱者設置爲0,並因此重置流 - 這就是爲什麼您正在經歷第二個網絡任務任何未來的訂閱。

爲什麼它可以與publishLast().refCount()一起使用? - 與publishLast()你得到一個永不完成的流,因此沒有用戶自動取消訂閱和流不會被重置。


對於緩存HTTP響應,您的方法與publishLast().refCount()是完全有效的。

+0

謝謝olsn。這使得現在展現的行爲更加清晰。我還有一個問題:是'publishLast()。refCount()'和隱含的永不完成流被認爲是緩存http請求的好習慣嗎? – balteo

+0

絕對是的 - 但我已經更新了答案,並在SO – olsn

+0

上的rxjs-doc-section的附加鏈接上感謝了很多關於此詳細回覆和鏈接! – balteo