$ q.all在服务的$ http请求之前解析吗?

时间:2014-07-10 04:05:19

标签: angularjs

我有一个服务,我在那里进行一些http调用。我希望在所有通话结束后使用$ q.all显示消息。但是,在发送ajax调用之前会显示该消息。 Plunker:http://plnkr.co/edit/xgIlCyQPadOrwHCP5HJj?p=preview

  var request1 = function(){return reportService.getReport("data.json",1,1)},

  request2 = function(){return reportService.getReport("data2.json",2,2)},

  request3 = function(){return reportService.getReport("data3.json",3,3)}

  $q.all([request1(),request2(),request3()]).then(console.log("All Done!!"));    

3 个答案:

答案 0 :(得分:2)

我认为最好的方法是拦截器。

您可以跟踪已拨打的电话以及已解决的响应。基于此,您可以通过在rootscope上广播然后根据这些广播显示消息来显示消息。

以下是拦截器的示例,当有打开请求时广播'open_requests',然后在所有请求完成时广播'all_requests_done':

.factory('httpInterceptor', function ($q, $rootScope){    
    var numLoadings = 0;    
    return {
        request: function (config) {    
            numLoadings++;

            $rootScope.$broadcast("open_requests");
            return config || $q.when(config)

        },
        response: function (response) {    
            if ((--numLoadings) === 0) {
                $rootScope.$broadcast("all_requests_done");
            }

            return response || $q.when(response);    
        },
        responseError: function (response) {    
            if (!(--numLoadings)) {
                $rootScope.$broadcast("all_requests_done");
            }

            return $q.reject(response);
        }
    };
})
.config(function ($httpProvider) {
    $httpProvider.interceptors.push('httpInterceptor');
});

希望这有帮助。

答案 1 :(得分:1)

$ q.all中应该有一个回调,而不是直接调用console.log

 $q.all([request1(),request2(),request3()]).then(function(){
    console.log("fatto")

  });

答案 2 :(得分:0)

试试这个:

var request1 = function(){
      var deferred=$q.defer();
   deferred.resolve(reportService.getReport("data.json",1,1));
   return deferred.promise;
  },

request2 = 
function(){
var deferred=$q.defer();              
 deferred.resolve(reportService.getReport("data2.json",2,2));
 return deferred.promise;

 },

  request3 = function(){
 var deferred=$q.defer(); 

 deferred.resolve(reportService.getReport("data3.json",3,3));
 return deferred.promise;
 }

 return $q.all([request1(),request2(),request3()]).then(console.log("All Done!!"));