1

Ionic アプリでAngular を使用$http.get()して外部サービスへの API 呼び出しをCacheFactory行い、プラグインを実装してキャッシュをより構成可能にしました。

同じエンドポイントに対して繰り返し API リクエストを行うと、CacheFactory はキャッシュされたレスポンスを返し、キャッシュの有効期限が切れるまでブラウザ コンソールに実際の HTTP リクエストが表示されません。

しかし、使用しているデータがキャッシュから取得されたものか、新しい HTTP 要求から取得されたものかを識別できるようにしたいと考えています。これどうやってするの?

コンソールに出力をログに記録させると、$http.get()有用なものは何も表示されません。実際、キャッシュまたは HTTP 呼び出しからの応答オブジェクトは同一です。

どんなアイデアもありがたく受け取った。

4

1 に答える 1

0

リクエストの入力を記憶することができるので、get メソッドを呼び出すと、メモライザー オブジェクトにリクエスト パラメータによるハッシュ形式と等しいキーが含まれている場合、同じものが含まれている限り、このリクエストがキャッシュされることがわかります。 params は以前の他のリクエストと同じです。各キーの下にタイムスタンプを保存して、そのリクエストが最初に実行されてから現在までのミリ秒の差を計算できます。

// some where on your code

app.factory('MyMemorizer', ['EXPIRATION_CACHE_TIME', function 

(EXPIRATION_CACHE_TIME) {
// EXPIRATION_CACHE_TIME constant with the milliseconds of the expiration cached
var memo = {};
  return {
    entryExist: function (obj) {
      var timestamp = getEntry(inputs),
      timeDelta = Date.now() - timestamp;
      return timeDelta > EXPIRATION_CACHE_TIME);
    } 

  };

  function getEntry(obj) {
      var hash = createHash(obj);
      if (memo.hasOwnProperty) {
        return memo[hash];
      }

      memo[hash] = Date.now();
      return memo[hash];
    }


  function createHash(obj) {
   var arr = [];
   for (prop in obj) {
     if (obj.hasOwnProperty(prop)) {
       arr.push(encodeURIComponent(prop) + '=' + encodeURIComponent(obj[prop]));
     }
   }

   return arr.join('&');
  }

});

次に、コントローラーまたはサービス、または必要な場所に注入します。

function invokeGetRequest (inputs) {

  // ... do your request

  if (MyMemorizer.entryExist(inputs)) {
    // request is cached
  }

}
于 2015-05-22T14:46:06.887 に答える