2017-06-04 75 views
2

我正在創建一個Angular應用程序並擁有API服務。如果請求的數據不在緩存中,我的get方法只會進行HTTP調用。我正在使用基於Promise的LocalForage庫,並將它們轉換爲Observables。RxJS Observables,在發出API請求之前檢查緩存

export class CacheService { 
    get(prop: string) { 
    return Observable.fromPromise(localForage.getItem(prop)); 
    } 
在我的API服務

現在,我的賽車我的緩存和HTTP可觀,像這樣:

export class ApiService { 
    get(uri: string) { 
     return Observable.race(
     this.cache 
      .get(uri) 
      .filter(res => !!res), 

     this.http.get(uri) 
    ); 
    } 
} 

由於Observable.race只返回發射第一可觀察到的,我以爲只要我使用那個.filter()運營商,一切都會解決。但是,如果數據不在緩存中,它們都不會返回,所以HTTP請求永遠不會被創建。如果有人能指出我的錯誤或提出更好的解決方案,我全都聽過。

+0

哪裏是你的訂閱? –

+0

@YakovFain謝謝你的回覆。我確定我的訂閱不是問題,因爲如果我刪除'.filter',那麼我得到的響應爲空,因爲緩存還沒有任何內容。 – yazeedb

+0

@yazeedb嗯.... Observable.race行爲對我來說似乎很陌生。當其中一個源完成時(因爲https://github.com/ReactiveX/rxjs/blob/master/src/OuterSubscriber.ts#L20-L22),Federico Galassi在回答中提到了它會發送'complete'通知,但是,它猜測這不是預期的行爲。 – martin

回答

3

問題是race一旦完成其中一個可觀測量就完成。您的緩存調用不會發出空值,而是立即完成。您可以使用merge保持完成後會和take(1)只考慮第一個結果:

export class ApiService { 
    get(uri: string) { 
     return Observable.merge(
     this.cache 
      .get(uri) 
      .filter(res => !!res), 

     this.http.get(uri) 
    ).take(1); 
    } 
}