2017-04-06 22 views
2

我想在我的Angular服務中實現短期緩存 - 一組子組件快速連續創建,並且每個組件都有一個HTTP調用。我想在頁面加載時緩存它們,但不是永遠。share()vs ReplaySubject:哪一個,哪個都不能工作

我試過以下兩種方法,這兩種方法都沒有奏效。在這兩種情況下,對於創建的組件的每個實例,都會爲HTTP URL命中一次;我希望避免這種情況 - 理想情況下,創建網格時URL將被命中一次,然後緩存過期,並且下一次我需要創建它再次訪問URL的組件。我從StackOverflow的其他線程中提取了兩種技術。

份額()(在服務)

getData(id: number): Observable<MyClass[]> { 
    return this._http.get(this.URL) 
     .map((response: Response) => <MyClass[]>response.json()) 
     .share(); 
} 

ReplaySubject(服務中)

private replaySubject = new ReplaySubject(1, 10000); 
getData(id: number): Observable<MyClass[]> { 
    if (this.replaySubject.observers.length) { 
     return this.replaySubject; 
    } else { 
     return this._http.get(this.URL) 
      .map((response: Response) => { 
       let data = <MyClass[]>response.json(); 
       this.replaySubject.next(data); 
       return data; 
      }); 
    } 
} 

呼叫者(在組分)

ngOnInit() { 
    this.myService.getData(this.id) 
     .subscribe((resultData: MyClass[]) => { 
      this.data = resultData; 
     }, 
     (error: any) => { 
      alert(error); 
     }); 
} 

每次創建組件時都確實不需要點擊URL - 它們會返回相同的數據,並且在包含該組件的行的網格中,數據將是相同的。當網格本身被創建時,我可以調用,並將該數據傳遞給組件。但我想避免這種情況,原因有兩個:首先,組件應該相對自給自足。如果我在別處使用組件,我不希望父組件也必須在那裏緩存數據。其次,我想找到一個可以在應用程序中的其他地方應用的短期緩存模式。我不是唯一一個在這方面工作的人,我想保持代碼清潔。

回答

3

最重要的是,如果您希望在創建/銷燬Angular組件時使某些內容持久化,則無法在該組件中創建該組件,而是在組件間共享的服務中創建該組件。

關於RxJS,您通常不必直接使用ReplaySubject,而只需使用publishReplay(1, 10000)->refCount()

share()運算符只是publish()->refCount()的簡寫,它在內部使用Subject,這意味着它不會重播緩存的值。

+0

我可能一直不清楚(我會用這個信息更新這篇文章),但'share()'和'RelaySubject()'代碼在服務中,而調用者代碼在組件中。 –