9

コールバックで明示的に呼び出すことなく、サーバーから応答が返された後に毎回関数を呼び出す方法はありますか?

主な目的は、すべてのリクエストのコールバックで呼び出す一般的なエラー ハンドラー サービスがあり、それをどこかに指定して自動的に呼び出されるようにすることです。

4

2 に答える 2

16

私はGloopyにソリューションの+1を与えましたが、彼が参照する他の投稿は、構成とインターセプターで定義された関数でDOM操作を行います。代わりに、スピナーを開始するためのロジックをインターセプターの上部に移動し、変数を使用し$rootScopeてスピナーの非表示/表示を制御します。それはかなりうまく機能しているようで、はるかにテストしやすいと思います。

<img ng-show="polling" src="images/ajax-loader.gif">
angular.module('myApp.services', ['ngResource']).
.config(function ($httpProvider) {
    $httpProvider.responseInterceptors.push('myHttpInterceptor');
    var spinnerFunction = function (data, headersGetter) {
        return data;
    };
    $httpProvider.defaults.transformRequest.push(spinnerFunction);
})
//register the interceptor as a service, intercepts ALL angular ajax http calls
.factory('myHttpInterceptor', function ($q, $window, $rootScope) {
    return function (promise) {
        $rootScope.polling = true;
        return promise.then(function (response) {
            $rootScope.polling = false;
            return response;
        }, function (response) {
            $rootScope.polling = false;
            $rootScope.network_error = true;
            return $q.reject(response);
        });
    };
})
// other code left out
于 2012-08-08T18:32:33.453 に答える
3

$httpまたはを使用するリクエストの場合は$resource、コードを$httpProvider.responseInterceptors. この投稿で詳細を参照してください。

このフィドルを使用してスピナーを開始/停止することについてですが、「スピナーの停止」セクションにコードを追加できます// do something on error. グループのzdamに感謝!

于 2012-08-08T16:50:54.127 に答える