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

Angular storing server data in a global service. How do I ensure it is there

我的应用程序中有一个 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 服务是否在我需要时加载了数据,尤其是当应用程序首次加载时,这取决于运气....

保存诺言和return诺言。创建承诺 一次 并重用它。

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

你做的事情很简单。 可能向您的服务器发出 $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 return 是一个承诺 :)

请记住,如果您有一个承诺,那么您可以在其上调用 THEN - THEN 代码将在承诺被解决时执行(不是立即)。您甚至可以通过 return THEN 的承诺来链接 THEN。希望这一切对您有所帮助。

如果方法 return 是一个承诺,那么您可以在其 return 值上调用 THEN。请记住 $http return 是一个在您的服务器响应或请求超时时解决或拒绝的承诺!