我正在为http通信创建一个服务,我需要一些方法来返回一个值。
但是当我调用success时,我得到一个类型错误;(…
“typeerror:无法读取未定义的属性'success'”
angular.module('myApp').controller('mainCtrl', function($scope, apiService){
$scope.GetJson = function() {
apiService('post','http://myApiAddress', "{'dataFn': 'userInfo'}")
.success(function(response) { // ERROR !!! TypeError: Cannot read property 'success' of undefined
$scope.userinfo = response;
})
.error(function(error){
console.log(error);
})
}
})
---------------------------------------------------------------------------
var module = angular.module('httpService',[]);
module.factory('apiService',['$http',function($http){
var userAuthority = true; // or false (boolean Value)
var apiService = function (method, url, param){
if(userAuthority){
apiService.idCheck().success( function(res) {
return $http[method](url, param);
})
.error( function(err) {
console.log(err);
})
}
else {
return $http[method](url, param);
}
};
apiService.idCheck = function () {
return $http.get('http://myApiAddress');
};
}])
我在寻找两个答案之一:
为什么成功回调返回错误?
我怎样才能纠正这个错误?
最佳答案
创建factory
时,需要返回Object
。您的工厂返回apiService
。
添加此行undefined
。
更新
为什么会出错?
出现此错误是因为当您调用return apiService
时,它将调用另一个异步函数apiService
。同时,在函数idCheck
中,这里:
return $http[method](url, param);
不会返回到
apiService
。而是返回到匿名函数:function(res) {
return $http[method](url, param);
})
因此,
apiService
的返回值是apiService
。如何修复?
手动创建延迟/承诺对象:
module.factory('apiService',['$http', '$q', function($http, $q) {
...
var apiService = function (method, url, param){
var deferred = $q.defer();
if(userAuthority){
apiService.idCheck().success(function(res) {
$http[method](url, param).success(function(res) {
deferred.resolve(res);
}).error(function(err) {
deferred.reject(err);
});
}).error( function(err) {
deferred.reject(err);
});
return deferred.promise;
} else {
return $http[method](url, param);
}
};
...
供参考:
undefined
,$http