2017-09-26 3 views
1

キャッシングをより簡単にするために問題があります。私はこれを行うより良い方法があると思う。私の問題は、コードの長さが長くなる結果になるすべてのget()関数でこの "キャッシュ"コードを実行する必要があることです。誰にでもこれを最善の方法でやる方法を教えてください。ありがとう。以下は私のコードです。私がコードで行ったことは、私のnews.service.tsのget()関数を使ってhttpからデータを取得し、ニュースリストに登録することです。HttpClientからデータをキャッシングする4

news.service.ts

getAllNews() { 

    if(this.newslist != null) { 
     return Observable.of(this.newslist); 
    } 

    else { 

     return this.httpClient 
     .get('http://sample.com/news') 
     .map((response => response)) 
     .do(newslist => this.newslist = newslist) 
     .catch(e => { 
      if (e.status === 401) { 
       return Observable.throw('Unauthorized');   
      } 

     }); 
    } 
    } 

ニュース-list.service.ts

this.subscription = this.newsService.getAllNews() 
     .subscribe(
     (data:any) => { 
      console.log(data); 
      this.newslists = data.data.data; 
     }, 
     error => { 
      this.authService.logout() 
      this.router.navigate(['signin']); 
     }); 
    } 
+0

私は間違っているとは思わない... – Leo

+0

@Leo。ああ、私はget()関数を実行するたびにそれを使用しますか?それが最善の解決策でしょうか? – Joseph

+0

キャッシュは正確には何ですか? 'ニュースリスト'? – Leo

答えて

1

私はnews.service.tsとの間にどのような違いすぎてわからないんだけどnews-list.service.tsが主なコンセプトですが、懸念を分ける必要があるということです。あなたがすることができる最も基本的な分離は、「データコンシューマ」

データプロバイダ

これは、フェッチしたデータを管理して何でもかまいませんから、「データ・プロバイダー」をdistiguishingことです。あなたの例では、news.service.tsは、ニュースに関するすべてのもののためのWeb APIクライアント/プロキシだと私には思われます。

小さなファイルの場合は、すべてのニュース関連のキャッシュ管理をこのファイルに移動するか、キャッシュを管理する別のコンポーネントを作成してnews.service.tsをラップします。キャッシュが存在しないか期限切れになった場合、そのコンポーネントはキャッシュからデータを処理し、news.service.tsメソッドを呼び出します。このようにしてnews.service.tsの唯一の責任は、APIにajaxリクエストを行うことです。ここで

は、ちょうどあなたのアイデアを与えることを取り扱う約束、観測またはエラーなし例です...

class NewsProvider{ 

    constructor(){ 
     this.newsCache = []; 
    } 

    getNewsItemById(id){ 
     const item = this.newsCache.filter((i) => {i.id === id}); 

     if(item.length === 1) return item[0]; 

     this.newsCache = newsService.getAllNews(); 

     item = this.newsCache.filter((i) => {i.id === id}); 

     if(item.length === 1) return item[0]; 
     else return null; 
    } 
} 

データ消費者

これらは、データを必要とするすべてのコンポーネント、でニュースティッカーだろうホームページ、ナビゲーションメニューのどこかのバッジ通知....ニュース関連のデータを必要とするコンポーネント(またはビュー)があります。そのため、これらのコンポーネント/ビューは、そのデータがどこから来ているかを知る必要はありません。

データの主な情報源

概要

キャッシュしかないにする必要がある(とすることができます)としてこれらのコンポーネントは、「データ・プロバイダー」を使用しますが1つの場所だけでなく、ネットワーク関連の操作で管理

+0

ありがとう、レオ。しかし、私はこのgetAll()を試みました{ \t if(!this.news){ \t \t this.news = this.httpClient。( "のhttp://サンプル/ニュース")を取得 \t \t \t \t \t \t \tの.map((レスポンス=>応答)) \t \t \t \t \t \t \t .publishReplay(1) \t \t \t \t \t refCount(); \t} \tこれを返信する。 } – Joseph

+0

私はservice.tsで.mapを使用し、それをcomponent.tsに登録しました。そのため、component.htmlにデータを表示できます。私はこれが最善で最短の方法であるのか、正しい方法であるのか分かりません。 – Joseph

関連する問題