これは私が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
OK、私は今、私のエラーを取得します。私は 'publishReplay'と' refCount'を使うことができますが、もし私が加入者を持っていなければ、基本的なシーケンス値のいくつかを見逃すかもしれません。 私はこの直後に 'subscribe'を呼び出すことでこれを解決しましたが、それは素晴らしい解決策ではないと思います。 –
私はそれについてのSOのドキュメントの詳細な説明との投稿を作成しました:http://stackoverflow.com/documentation/rxjs/8247/common-recipes/26490/caching-http-responses#t=201612161544428695958 – martin