Angular — проблемы с получением ответа $http от фабрики

У меня есть angular factory, выполняющий некоторую $http связь с сервером и возвращающий строку. Однако я получаю ошибку Cannot read property 'then' of undefined. Я прочитал здесь и здесь с похожими проблемами, однако я не смог решить свою проблему.

Это сервисный код:

factory("availabilityService", ['$http', function ($http) {

    return {
        checkAvailability1: function (element, string) {
           // ..... some object creation code ......
            $http({
                method: 'POST',
                url: 'server/server.php',
                data: AvailableObj,
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded'
                }
            })
                .then(function successCallback(response) {
                    return response;

                }, function errorCallback(response) {
                });
        }
    }
}]);

Внутри controller:

$scope.checkAvailability = function (element, string) {
   availabilityService.checkAvailability1(element, string).then(function (response) { //on this line the error occurs 
       console.log(response);

   });

person Alex    schedule 27.12.2016    source источник


Ответы (1)


Вам нужно вернуть обещание, возвращенное $http, т.е. добавить «возврат» перед $http, чтобы ваш код работал, как показано ниже:

return $http(...)
    .then(function successCallback(response) {
        return response;
    }, function errorCallback(response) {
    });

Это связано с тем, что функция, которую вы вызвали из контроллера, должна иметь метод .then, то есть это должно быть обещание. checkAvailability1 в angular возвращает обещание, которое должно быть возвращено вашей функцией $http на фабрике. Вы просто возвращаете ответ от обратного вызова успеха, который не ожидается вашим методом в контроллере.

person Supradeep    schedule 27.12.2016
comment
Можете ли вы объяснить логику этого? Я уже вернул сам объект и ответ на http запрос. - person Alex; 27.12.2016
comment
@undroid Вы возвращаете этот ответ из метода обратного вызова, а не из функции, которая фактически сделала запрос $http (checkAvailability1). Этот результат никогда не выходит за рамки checkAvailability1. Операторы return не всплывают неявно в стеке вызовов. - person Harris; 27.12.2016