すべての$ httpコールが処理されたときにイベントをトリガーする必要があります。また、コールが失敗したかどうかを知る必要があります。私は、インターセプタを使用するなどのstackoverflowで利用可能なソリューションを使用してみました。すべての$のHTTP呼び出しが完了した後
angular.module('app').factory('httpInterceptor', ['$q', '$rootScope',
function ($q, $rootScope) {
var loadingCount = 0;
return {
request: function (config) {
if(++loadingCount === 1) {
$rootScope.$broadcast('loading:progress');
}
return config || $q.when(config);
},
response: function (response) {
if(--loadingCount === 0) {
$rootScope.$broadcast('loading:finish');
}
return response || $q.when(response);
},
responseError: function (response) {
if(--loadingCount === 0) {
$rootScope.$broadcast('loading:finish');
}
return $q.reject(response);
}
};
}
]).config(['$httpProvider', function ($httpProvider) {
$httpProvider.interceptors.push('httpInterceptor');
}]);
しかし、このアプローチで$rootScope.$broadcast('loading:finish')
が呼び出されます。すべての$ http呼び出しが終了したときにイベントをトリガーしたい
私のページ内の$http
コールはさまざまなディレクティブに属し、同じコントローラでは呼び出されないため、$q
は使用できません。
あなたは '$ http.pendingRequests'を利用することができます。 $ http.pendingRequests.length!== 0かどうかを確認できます。 – talentedandrew
$ httpコールが約束を返すので、これらのすべての$ httpコールを保持するサービスを作成できます。このサービスは約束の集合なので、次のように書く必要があります。Promise.all(....) – ABOS
@ABOS、私はPromise.all()について読んでみる。しかし、あなたの質問に戻ってきます!ありがとう。 – InquisitiveP