2017-01-23 13 views
2

しばらくの間結果をキャッシュするObservableを作成しました。この例はすばらしい、非常に便利です!しかし、アイテムプロデューサのタイムアウトを設定できませんでした。 mockDataFetch()のタイムアウト演算子を使用しようとしましたが、最初に失敗した項目の後にストリームを復元できませんでした。 タイムアウトでmockDataFetchを達成するにはどうすればよいですか?RxJS Observableでcache throught `.publishReplay()`のタイムアウトを設定する方法は?

これは私がやったことを正確です:一方

const Observable = Rx.Observable; 

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

function mockDataFetch() { 
    return Observable.of(counter++) 
     .delay(Math.floor((Math.random() * 100) + 1)) 
     .timeout(50); 
} 

function mockHttpCache() { 
    return updateRequest 
     .take(1); 
} 

mockDataFetch内Excpetionを取得した場合はどうなりますか?次の項目(1000秒後、publishReplayメソッドで定義されているように)では、observableが新しい項目を生成することが期待されます。

答えて

1

私はこの例を更新し、このユースケースを追加する必要があると思います。これはかなり一般的な状況です(とにかく、便利だと思います)。

mockDataFetch()から返されたObservableがエラー/完了通知を送信すると、Subject insideは自分自身を停止としてマークします(説明はRx.Subject loses events参照)ので、アイテムは再送信されません。あなたが理想的mockDataFetch()catch()オペレータですべてのエラーをキャッチすることができます:

function mockDataFetch() { 
    return Observable.of(counter++) 
     .delay(Math.floor((Math.random() * 100) + 1)) 
     .timeout(50) 
     .catch(err => Observable.of('This request is broken.')); 
} 

ライブデモを参照してください:このからhttps://jsbin.com/jiguti/5/edit?js,console

出力は次のように、たとえばなります:

Response 0: This request is broken. 
Response 50: This request is broken. 
Response 200: This request is broken. 
Response 1200: 2 
Response 1500: 2 
Response 3500: This request is broken. 
+0

優秀な答えを。ありがとう!!私はあなたの提案に従った。 私は、エラーを受け取ることができると同時に、将来の観察者に観察可能なものを提供し続ける方法を見出そうと考えました。 ReactiveX仕様によれば、エラーや完全な通知の後に新しい項目を受け取ることはできませんが、他の項目を囲むような観測可能な項目を持つことは可能ですが、同様の効果を得ることは可能です。つまり、最初の観測は、その下線観測の放出を傍受し、エラーの場合は、将来のサブスクリプションのために新たな観測可能性を構築する。 – cspinetta

関連する問題