2016-12-16 6 views
7

RxJSを5.0.0-rc.0にアップグレードする前に、私は.cache()を使ってAngularアプリケーションでサブスクリプションを共有していました。これを使用する大きな利点は、新しいサブスクリプションが最後に公開された値を取得することでした。RxJS 5とキャッシュオペレータの代替語

RxJSチームはこれを取り除くことに決めました。今私自身が手作業でBehaviorSubjectまたはReplaySubjectを配線してから、いつも.asObservable()と呼んでいます。これはこれまでにやった簡単なやり方を考えると、定型文のように思えます。

もっと簡単な方法がありませんか? .replay()オペレータが見つかりません。.share()オペレータと.publishReplay()オペレータは、この操作を実行していないようです。

ありがとうございます!

答えて

5

これは私がRxJSを誇示するために使用するものです。次の例では、最新の嘲笑されたHTTP応答を1秒間キャッシュします。これは、publishReplay()refCount()によるRxJSマルチキャストに基づいています。

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