2015-01-02 29 views
5

我的服務需要異步檢索一個值,但是一旦我有了它,我想使用緩存版本的值。角度服務緩存一個值

當兩個控制器調用這個服務時,我希望第一個緩存檢索值,第二個使用緩存值,但根據日誌,我從來沒有找到緩存值。當它運行時,我看到一條日誌消息,顯示正在緩存的值,然後,當我沿着一個角度路由到另一個控制器時,我看不到該服務找到緩存的值。爲什麼它沒有按照我的期望運行**

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不客氣。很高興它有一些幫助。您可以添加的另一件事是取消catch塊中的緩存諾言。就這樣,你不會總是將失敗的承諾保存在緩存中。是的,緩存承諾減少了緩存數據時所需的代碼排列數量,畢竟承諾只是數據的代理。 – PSL

+0

@ user1272965如果您認爲我(和其他人)正在迂腐,我很抱歉。這對你來說可能看起來如此,但這僅僅是因爲當人們不清楚問題是什麼以及人們花費(無用)時間來解決一個不存在的問題時,我們提出了許多經驗。所以這裏很清楚,希望你們不要對SO社區產生偏見。但我很高興PSL也認爲競賽條件是問題的核心:) – dirkk