Angularjs 在全局服务中存储服务器数据。我如何确保它在那里

Angularjs 在全局服务中存储服务器数据。我如何确保它在那里,angularjs,angularjs-service,Angularjs,Angularjs Service,我的应用程序中有一个globalDataService,可以从服务器读取几个实体 我只想读取数据一次,然后通过服务上的方法提供数据。这是一个简化的版本 angular.module("myApp").factory("globalData", ["siteResource", globalData]); function globalData( siteResource) { var sites = []; siteResource.query().$promise.then(

我的应用程序中有一个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做一些事情,但没有任何乐趣


当我需要数据时,globalData服务是否加载了数据,尤其是当应用程序第一次加载时,这是运气好的…

保存承诺并返回承诺。创建承诺一次并重复使用

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 };
}

你所做的很简单。 Prob向服务器发出$http请求以获取数据。但你不想每次都在init上创建它们

你可以像这样使用$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的承诺来约束THENs。希望这一切都有帮助


如果一个方法返回一个承诺,那么您可以调用它的返回值。记住$http返回一个承诺,当服务器响应或请求超时时,该承诺将被解析或拒绝

请看:。您希望从工厂返回
promise
,工厂将解析为缓存的结果,并在不存在时获取该结果。你可以自己解决
承诺
。太好了,谢谢你,我缺少的环节是让服务返回承诺。。。