我正在为http通信创建服务,我需要一些方法来返回一个值。 但是当我称之为成功时,我得到了一个类型错误;(..
" TypeError:无法读取属性'成功'未定义"
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');
};
}])
我正在寻找两个答案中的一个:
答案 0 :(得分:1)
创建factory
时,您需要返回Object
。您的工厂apiService
会返回undefined
。
添加此行return apiService
。
您收到此错误是因为当您致电apiService
时,它会调用另一个异步函数idCheck
。同时,在函数apiService
中,这里:
return $http[method](url, param);
未返回apiService
。相反,它将返回匿名函数:
function(res) {
return $http[method](url, param);
})
因此,apiService
的返回值为undefined
。
手动创建延迟/承诺对象:
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);
}
};
...