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 */
}