Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Angular js.then不是一个函数_Javascript_Angularjs - Fatal编程技术网

Javascript Angular js.then不是一个函数

Javascript Angular js.then不是一个函数,javascript,angularjs,Javascript,Angularjs,我有一个加载数据的服务 angular.module('App').service('daysService', ['$http','$q',function($http,$q) { var days = []; return { loadDay: function() { $http({ method: 'get',

我有一个加载数据的服务

 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不是一个函数

有什么建议吗

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.');
                  });
                };
      }]);

最后,您没有从函数返回承诺:

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.');
            }
        );
    };
}]);

您没有从
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.');
        });
    }
 };
返回{
loadDay:function(){

return$http({//如果你想使用
,你的工厂应该返回一个承诺,而不是
。然后()
。我相信你可以做类似
返回$q.when(days)
的事情,而不是
返回天
,这应该是可行的

还需要注意的是,
.success()
.failure()
回调从Angular 1.4开始就不推荐使用。不确定您使用的是哪个版本,但
$http
现在使用
。然后遵循此模式:

$http({stuff}).then(function successCallback(response) {
    //success
  }, function errorCallback(response) {
    // error
  });


如果您仅创建承诺,那么您就可以将其与
一起使用。然后()
。查看此文档了解如何创建承诺。它很简单

您的代码现在无法使用
.then()
,并且对象/对象属性不存在,因此错误
TypeError:daysService.loadDay.then不是一个函数
。否则,请编写一个不需要您使用
.then()
的代码,但可以作为正常触发的函数工作。这也会起作用

/* In your service  */
angular.module('App').factory('daysService', ['$http',function($http) {

    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.');
                      return;
                  });
                }
            };

      }]);

/* In your controller trigger the eventorclick */
$scope.trigger = function(){
$scope.modelname = daysService.loadDay(); /* returns days else undefined or null */
alert($scope.modelname); /* handle your issues if you have array of objects */
}

服务
更改为
工厂
是否尝试使用
loadDay()
而不是
loadDay
?考虑到它是一个函数…@nem已经得到了答案,但您使用
服务的方式实际上是如何使用
工厂
,如果您正确使用
服务
,那么您应该像这样声明
loadDay
this.loadDay=function(){}
不返回任何内容您也不会从
loadDay
功能返回任何内容您还必须返回
$http
 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());
/* In your service  */
angular.module('App').factory('daysService', ['$http',function($http) {

    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.');
                      return;
                  });
                }
            };

      }]);

/* In your controller trigger the eventorclick */
$scope.trigger = function(){
$scope.modelname = daysService.loadDay(); /* returns days else undefined or null */
alert($scope.modelname); /* handle your issues if you have array of objects */
}