2017-01-23 45 views
2

我創建了一個Observable,在一段時間內緩存它們的結果。這個例子很好,非常有用!但我無法爲物品製作者設置超時時間。我試圖在mockDataFetch()中使用超時運算符,但在第一個失敗項目後,流無法恢復。 如何通過超時實現mockDataFetch如何通過`.publishReplay()`緩存設置RxJS Observable超時?

這正是我所做的:

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內得到一個錯誤時拋出,會發生什麼?我期望在下一個項目(在1000ms之後,因爲它在publishReplay方法中定義),可觀察項發出一個新項目。

回答

1

我想我應該更新這個例子並添加這個用例,因爲這是一個很常見的情況(無論如何,我很高興你覺得它有用!)。

當從mockDataFetch()返回的Observable發送錯誤/完整通知時,Subject內部標記爲停止(請參閱說明Rx.Subject loses events),以便它不會重新發送任何項目。你可以趕上理想與catch()運營商所有的錯誤裏面mockDataFetch()

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