2015-01-02 8 views
5

私のサービスは値を非同期的に取得する必要がありますが、いったん取得すれば、キャッシュされた値を使用したいと思います。角度サービスキャッシュの値

2つのコントローラがこのサービスを呼び出すと、最初にキャッシュされた値をキャッシュし、2番目のキャッシュにはキャッシュされた値を使用すると考えられますが、ログによればキャッシュされた値は決して見つかりません。これが実行されると、値がキャッシュされていることを示すログメッセージが表示されます。別のコントローラへの角度経路をたどると、キャッシュされた値が見つかることはありません。なぜそれは私の期待に応じて実行されません**

angular.module('myApp.services').factory('Config', function() { 

    var Config = { }; 

    Config.currentYear = function() { 
     if (Config._currentYear) { 
      // sadly, we never execute here 
      console.log("returning cached year"); 
      return Parse.Promise.as(Config._currentYear); 
     } 
     return Parse.Config.get().then(function(config) { 
      console.log("caching year"); 
      Config._currentYear = config.get("currentYear"); 
      return Config._currentYear; 
     }); 
    }; 

    return Config; 

}); 

カップルノート:?(1)私は、関数名との衝突を回避するためにアンダースコアを追加し、キャッシュされた属性_currentYearの名前。もし私がそれをする必要があるかどうかはわかりません。 (2)値がキャッシュされているときに私は約束を返します。したがって、関数は常に約束を返します。それが必要なのかどうかも分かりませんが、傷つけることはできません。

+2

問題は何ですか? – dfsq

+0

そのコードの下に質問に記載されています。質問部分をコードの上に移動しました – user1272965

+0

他の類似した質問を確認しましたか? http://stackoverflow.com/questions/15100020/using-angular-service-to-share-data-between-controllers – ochi

答えて

3

データをキャッシュするのではなく、約束をキャッシュして返すのはなぜですか。データをキャッシュするときは、成功コールバック内でのみデータConfig._currentYearを設定しており、成功コールバックが実行される前に他の後続コールが発生する可能性があります。それで、あなたは同じ電話をもう一度やります。同一のサービスメソッドに、インスタンス化されている異なるコントローラから、同じテンプレート上に存在することにより、呼び出しを行ったときに、これを簡単に見ることができます。約束を前もってキャッシュすれば、これらの問題を避けることができます。

angular.module('myApp.services').factory('Config', function() { 
    var config; //Just use to save the promise 
    Config.currentYear = function() { 
     /*If there is already a call made before return the promise else 
      make the actual call and store the promise in the variable.*/ 
     return config || config = Parse.Config.get().then(function(config) { 
      return config.get("currentYear"); 
     }); 
    }; 
}); 
+2

1)答えに感謝2)競合状態を避けるための約束をキャッシュする素晴らしいアイデア(私は他の場所でもそれを使用するつもりです)3)私の問題はadobe brackets nodejsサーバー(私が手作業で走った時、それはうまくいった)ですが、私はこれを役に立つと思っています。 – user1272965

+0

@ user1272965ようこそ。それはいくつかの助けになってうれしいです。追加できるもう1つのことは、キャッチブロック内のキャッシュされた約束を無効にすることです。ちょうどあなたはいつも失敗した約束をキャッシュに保持しません。はい、約束をキャッシュすることは、データをキャッシュするときに必要なコードの数を減らします。すべての約束はデータのプロキシに過ぎません。 – PSL

+0

@ user1272965私(と他の人たち)が賢明であると思うなら、ごめんなさい。これはあなたには似ているかもしれませんが、単に人々が自分の問題が何であるかを尋ねられず、人々が存在しなかった問題を解決するために(無駄な)時間を費やしたときに、多くの経験をしたからです。だからここではっきりとしていることは有望であり、あなたはSOコミュニティに偏っていないことを願っています。しかし、私はPSLも競争状態が問題の核心だと思ってうれしいです:) – dirkk