AngularJS - 如何在工厂中组合相同的并行$ http/$资源请求

S.B*_*.B. 0 javascript ajax angularjs

为简单起见,假设我有一个AngularJS应用程序,其中2个控制器同时执行,用于网站的不同部分.两个控制器都需要来自单个工厂的相同AJAX数据,这些工厂API看起来像这样:

app.factory('API', ['$http', function($http){
  return {
    getData: function(callback) {
      $http({method: 'GET', url: '/data'}).success(function(data, status, headers, config) {
        callback(data);
      });
    }
  };
}]);
Run Code Online (Sandbox Code Playgroud)

两个控制器执行API.getData(...) 在同一时间(所以首先得到响应之前),准确地接收相同的数据,但是用它做不同的事情.第二次(和后续)调用getData实际使用第一个请求中的数据的最佳方法是什么,一旦它在那里,而不是创建另一个AJAX调用?控制器对彼此一无所知,并且当只有其中一个进行此调用时也应该工作.

也许我过于复杂了,但我提出的唯一解决方案是callback在工厂范围的队列中手动排队所有函数,然后在"单例"AJAX调用完成时一起执行它们.有一个更好的方法吗?

我已经读过了$q.all,但它不适用于此(我认为),因为我实际上只想要一个请求而不是多个请求.

dnc*_*253 5

而不是传入回调,而是从函数返回promise.然后从第一个$ http调用中保存promise,这样当它被解析时,它会解析调用该函数的所有内容.像这样的东西:

app.factory('API', ['$http', function($http){
  var dataPromise;
  return {
    getData: function() {
      if (!dataPromise)
      {
         dataPromise = $http({method: 'GET', url: '/data'});
      }
      return dataPromise          
    }
  };
}]);
Run Code Online (Sandbox Code Playgroud)

然后在控制器中你可以使用返回的promise做任何数量的事情(参见promise文档),但是上面代码的功能等价物就像tis:

API.getData().success(function(data) {
    //my callback code
});
Run Code Online (Sandbox Code Playgroud)