Что эквивалентно jQuery ajax beforeSend в Angularjs?

Я знаком с JQuery AJAX call, который имеет разные обратные вызовы, например beforeSend, success, complete и т.д.

Это пример вызова AJAX с помощью JQuery:

$.ajax({
  url: 'register.php',
  type: 'POST',
  data: {name:name, email:email},
  beforeSend: function() {
       // show loading GIF
  },
  complete: function() {
      // hide loading GIF
  },
  success: function(data) {
      // parse response
  }
});

Я хочу добиться того же, используя AngularJS.

Есть ли обратный вызов, например beforeSend для запроса AngularJS AJAX? Это мой код до сих пор, но я не знаю, где я могу использовать обратный вызов, например beforeSend (чтобы я мог отображать загружаемое GIF-изображение) в моем коде:

$http.post('register.php', {'name': $scope.name, 'email': $scope.email})
.success(function(data, status, headers, config) {
    if (data != '') { 
    }
});

Ответы

Ответ 1

По умолчанию Angular не предоставляет beforeSend и завершает, но вы можете реализовать их с помощью перехватчиков. Вот моя реализация:

(function() {
    var app = angular.module("app");

    app.factory("interceptors", [function() {

        return {

            // if beforeSend is defined call it
            'request': function(request) {

                if (request.beforeSend)
                    request.beforeSend();

                return request;
            },


            // if complete is defined call it
            'response': function(response) {

                if (response.config.complete)
                    response.config.complete(response);

                return response;
            }
        };

    }]);

})();

Затем вам необходимо зарегистрировать свой перехватчик следующим образом:

    (function () {
        var app = angular.module('app', ['ngRoute']);


        app.config(["$routeProvider", "$httpProvider", function ($router, $httpProvider) {    

            // Register interceptors service
            $httpProvider.interceptors.push('interceptors');

            $router.when("/", { templateUrl: "views/index.html" })


            .otherwise({ redirectTo: "/" });        
        }]);
    })();

После этого кода вы можете использовать его следующим образом:

var promise = $http({
    method: 'POST',
    url: constants.server + '/emails/send',
    data: model,
    beforeSend: function() {
        model.waiting = true;
    },
    complete: function() {
        model.waiting = false;
    }
});

Ответ 2

Вы можете использовать interceptors. Найдите слово interceptor в Angular $http documentation

Как говорится в документации: для целей глобальной обработки ошибок, проверки подлинности или любой синхронной или асинхронной предварительной обработки запроса или последующей обработки ответов

Вот хороший Пример скрипта, отображающий загрузочный gif перед отправкой сообщения ajax.

ИЗМЕНИТЬ

Как заметил Сатпал, $httpProvider.responseInterceptors, используемый в Fiddle, deprecated. Вместо этого вы должны использовать $httpProvider.interceptors.