У меня есть этот сервис, который загружает данные ..

 angular.module('App').service('daysService', ['$http','$q',function($http,$q) {

    var days = [];

      return {
                 loadDay: function() {
                    $http({
                    method: 'get',
                    url: '/app/days/list/',
                  }).success(function(data) {              
                    days.push(data);
                    return days;  
                  }).error(function (data) {
                      console.log('Error checking server.');
                  });
                }
            };

      }]);

Чем в контроллере я называю службу

daysService.loadDay.then(function(data) {
   alert(data)
});

Но я получаю эту ошибку TypeError: daysService.loadDay.then is not a function

Любое предложение?

2
Fr4ncx 16 Дек 2015 в 17:16

5 ответов

Лучший ответ

Вы ничего не возвращаете из своей функции loadDay. Попробуй это:

return {
    loadDay: function() {
        return $http({   // <-- return the promise
            method: 'get',
            url: '/app/days/list/',
        }).success(function(data) {              
            days.push(data);
            return days;  
        }).error(function (data) {
            console.log('Error checking server.');
        });
    }
 };
3
sma 16 Дек 2015 в 14:25
 angular.module('App').service('daysService', ['$http','$q',function($http,$q) {

var days = [];

  return {
             loadDay: function() {
                $http({
                method: 'get',
                url: '/app/days/list/',
              }).success(function(data) {              
                days.push(data);
                //return days;  
              }).error(function (data) {
                  console.log('Error checking server.');
              });
            },getDays: function(){ return days; }

        };

  }]);

daysService.loadDay(); $window.alert(daysService.getDays());
0
Olencha 16 Дек 2015 в 14:40

Ваша фабрика должна вернуть обещание вместо days, если вы хотите использовать .then(). Я считаю, что вы можете сделать что-то вроде return $q.when(days) вместо return days, и это должно сработать.

Также просто заметим, что обратные вызовы .success() и .failure() устарели с версии Angular 1.4. Не уверен, какую версию вы используете, но $http теперь использует .then по следующему шаблону:

$http({stuff}).then(function successCallback(response) {
    //success
  }, function errorCallback(response) {
    // error
  });
1
Eric 16 Дек 2015 в 14:25
daysService.loadDay.then(function(data) {
   alert(data)
});

В первой строке вы не вызываете loadDay как функцию, к которой вы обращаетесь как свойство. поэтому вам нужно изменить это на это:

 daysService.loadDay().then(function(data) {
   alert(data)
});

Обратите внимание на круглые скобки на loadDay.

Во-вторых, вы используете сервис, как на заводе. Итак, у вас есть два варианта:

angular.module('App').service('daysService', ['$http','$q',function($http,$q) {   
    var days = [];

    this.loadDay = function() {
                    $http({
                    method: 'get',
                    url: '/app/days/list/',
                  }).success(function(data) {              
                    days.push(data);
                    return days;  
                  }).error(function (data) {
                      console.log('Error checking server.');
                  });
                };
      }]);

ИЛИ

angular.module('App').factory('daysService', ['$http','$q',function($http,$q) {
  var days = [];

  return {
             loadDay: function() {
                $http({
                method: 'get',
                url: '/app/days/list/',
              }).success(function(data) {              
                days.push(data);
                return days;  
              }).error(function (data) {
                  console.log('Error checking server.');
              });
            }
        };

  }]);

Наконец, вы не возвращаете обещание из функции:

function() {
    return $http({
        method: 'get',
        url: '/app/days/list/',
    }).success(function(data) {
        days.push(data);
        return days;
    }).error(function(data) {
        console.log('Error checking server.');
    });
};

И если бы я делал это, я бы сделал:

angular.module('App').factory('daysService', ['$http', '$q', function($http, $q) {
    var days = [];

    this.loadDay = function() {
        return $http.get('/app/days/list/').then(
            function(data) {
              days.push(data);
              return days;
            },
            function(data) {
              console.log('Error checking server.');
            }
        );
    };
}]);
3
Callum Linington 16 Дек 2015 в 14:24