我有一个服务,我在那里进行一些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!!"));
答案 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!!"));