2016-12-02 7 views
0

WebサービスからデータをロードしてlocalStorageに格納するAngularJS関数があります。この関数を初めて呼び出すと、(1時間後にキャッシュが無効でない限り)データはlocalStorageからロードされます。AngularJS:キャッシュされたURLまたはキャッシュされていないURLをロードする

私はこの機能を外部化したいと思いますが、私は頭を悩ませています。同期メソッドと非同期呼び出しを1つのメソッドに入れる方法です。さあ。

function callWebService(url) { 
    var resultFromLocalStorage = localStorage.getItem(url); 
    if (resultFromLocalStorage && Utils.cacheIsStillValid()) { //(*) 
     $timeout(function() { buildTable(JSON.parse(resultFromLocalStorage)); }, 10); 
    } else { 
     $resource(url).get().$promise.then(function(result) { 
      localStorage.setItem("cacheExpiry", new Date().getTime() + Utils.ONE_HOUR_IN_MS); 
      localStorage.setItem(url, JSON.stringify(result)); 
      buildTable(result); 
     }); 
    } 
} 
//*Utils.cacheIsStillValid checks the localStorage item "cacheExpiry" 

最後に、私はちょうどこの欲しいので、私は、そのキャッシュのものを外部化したいと思います:

function callWebService(url) { 
    var result = getResultFromCacheOrReload(url); // to be done 
    buildTable(result); 
} 

私はこれをどのように行うことができますか?メソッドgetResultFromCacheOrReload(url)はどのように見えますか?

おかげで、 ベルンハルト

+0

あなたがすべきプロにキャッシュを残す。 etagsを設定してブラウザにキャッシュするように指示します。 –

+0

お返事ありがとうございます。残念ながら私たちのサーバーにetagsを設定することはできません。 – Bernie

答えて

1

だけgetResultFromCacheOrReloadからpromiseを返し、それが解決されたときにテーブルを作成:

function callWebService(url) { 
    var result = getResultFromCacheOrReload(url).then(function (result) { 
     buildTable(result); 
    }); 
} 

機能getResultFromCacheOrReloadのようなものになります

function getResultFromCacheOrReload(url) { 
    var resultFromLocalStorage = localStorage.getItem(url); 
    if (resultFromLocalStorage && Utils.cacheIsStillValid()) { 
     return $q.when(resultFromLocalStorage); // Create a fulfilled promise containing resultFromLocalStorage 
    } else { 
     return $resource(url).get().then(function (result) { // Return the promise returned by the "then" method 
      localStorage.setItem("cacheExpiry", new Date().getTime() + Utils.ONE_HOUR_IN_MS); 
      localStorage.setItem(url, JSON.stringify(result)); 
      return result; // Every object returned by a then() method is wrapped by a promise 
     }); 
    } 
} 
+0

ありがとう、それは(ほぼ)それだった。 私はちょうどこの行を変更しなければなりません: 'return $ resource(url).get()。then(...)' と 'return $ resource(url).get()。$ promise.then(。 ..) ' これで動作します。 – Bernie

関連する問題