2016-12-16 47 views
7

在將RxJS升級到5.0.0-rc.0之前,我在很多地方使用.cache()來共享Angular應用程序中的訂閱。使用它的最大好處是任何新的訂閱都會獲得上次發佈的值。RxJS 5和緩存運營商的替代品

RxJS團隊決定將其刪除,現在我發現自己手動接線私人電話BehaviorSubjectReplaySubject,然後始終撥打.asObservable()。這看起來好像很多樣板,因爲我們以前需要這麼簡單的方法。

我錯過了一些更簡單的方法嗎?我找不到運營商.replay(),運營商.share().publishReplay()也沒有這樣做。

謝謝!

回答

5

這是我用來炫耀RxJS。以下示例將最新的模擬HTTP響應緩存1秒。它基於RxJS多播通過publishReplay()refCount()

var counter = 1; 
var updateTrigger = Observable.defer(() => mockDataFetch()) 
    .publishReplay(1, 1000) 
    .refCount() 
    .take(1); 

function mockDataFetch() { 
    return Observable.of(counter++) 
     .delay(100); 
} 

function mockHttpCache() { 
    return updateTrigger; 
} 

mockHttpCache().toPromise() 
    .then(val => console.log("Response from 0:", val)); 

setTimeout(() => mockHttpCache().toPromise() 
    .then(val => console.log("Response from 200:", val)) 
, 200); 

setTimeout(() => mockHttpCache().toPromise() 
    .then(val => console.log("Response from 1200:", val)) 
, 1200); 

setTimeout(() => mockHttpCache().toPromise() 
    .then(val => console.log("Response from 1500:", val)) 
, 1500); 

setTimeout(() => mockHttpCache().toPromise() 
    .then(val => console.log("Response from 3500:", val)) 
, 3500); 

見現場演示:https://jsbin.com/todude/3/edit?js,console

這將打印到控制檯:

Response 0: 1 
Response 50: 1 
Response 200: 1 
Response 1200: 2 
Response 1500: 2 
Response 3500: 3 
+0

OK,我現在讓我的錯誤。我可以使用'publishReplay'和'refCount',但是如果我沒有訂戶,我可能會錯過/跳過一些底層序列值。 我之後立即調用了'subscribe'來解決這個問題,但我想這不是一個好的解決方案。 –

+1

我在SO文檔中發佈了一篇文章,詳細解釋它是如何工作的:http://stackoverflow.com/documentation/rxjs/8247/common-recipes/26490/caching-http-responses#t=201612161544428695958 – martin