2015-12-11 28 views
0

我的應用程序中有一個globalDataService,它從服務器讀取幾個實體。在全球服務中角度存儲服務器數據。我如何確保它在那裏

我只想讀取一次數據,然後通過服務上的方法提供它。下面是一個簡化版本

angular.module("myApp").factory("globalData", ["siteResource", globalData]); 

function globalData(siteResource) { 
    var sites = []; 
    siteResource.query().$promise.then(function(data){ 
      sites = data; 
    }, 
    function(response) { 
     //handle bad stuff 
    }); 

    var getSites = function() { return sites; } 

    return { getSites: getSites }; 
} 

,並在我的控制器我只是希望能夠做到這一點

this.sites = globalData.getSites(); 

,並知道數據是存在的,如果不是,那麼什麼是錯的。在我的服務中需要做些什麼才能做到這一點,我只是浪費了2個小時試圖用$ q做些事情,但沒有任何快樂。

這是家常便飯的全球國際服務是否已加載數據或沒有我需要的時候,特別是當應用程序第一次加載....

+0

看看:https://github.com/chrisronline/angular-promise-cache。你想從你的工廠返回'''promise'',解析爲緩存的結果,如果不存在則取回。你可以自己解決'''promise''。 –

回答

0

保存的承諾和回報承諾。創建承諾一次並重新使用它。

angular.module("myApp").factory("globalData", ["siteResource", globalData]); 

function globalData(siteResource) { 
    var promise; 

    function getSitesPromise() { 
     if (!promise) { 
      promise = siteResource.query().$promise; 
      promise = promise.catch(function (error) { 
        //handle bad stuff 
      }); 
     }; 
     return promise; 
    }; 

    return { getSitesPromise: getSitesPromise }; 
} 
+0

完美,謝謝,對我而言缺失的鏈接正在使服務返回一個承諾... – LennieHarvey

0

你在做什麼很簡單。 Prob向您的服務器發送$ http請求以獲取數據。但是你不希望每次都只是在初始化階段創建它們。

你可以使用$ Q像這樣...

var promise1 = $http.get('/mypath1'); 
    var promise2 = $http.get('/mypath2'); 
    var promises = $q.all([promise1, promise2]); // resolves when all promises are resolved OR will reject when ONE promise rejects 
    promises.then(function(arrayContainingAllServerResponses) { 
     // do something 
    }).catch(function(error) { 
     // oops one of the requests failed 
    }) 

抱歉,但我沒有時間詳細 - 這可能讓你在正確的軌道上 - 歡呼

這個工程因爲$ HTTP返回一個承諾:)

請記住,如果您有承諾,那麼您可以調用THEN - THEN代碼將在解決承諾(不是立即)時執行。您甚至可以通過返回THEN的承諾來鏈接THEN。希望這一切都有幫助。

如果一個方法返回一個promise,那麼你可以調用THEN的返回值。記住$ http返回一個承諾,當你的服務器響應或請求超時時,這個承諾會被解決或被拒絕!