TypeError:无法读取属性'成功'未定义使用$ http

时间:2015-07-30 01:34:47

标签: jquery angularjs http callback typeerror

我正在为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');
  };
}])

我正在寻找两个答案中的一个:

  1. 为什么成功回调会返回错误?
  2. 如何解决此错误?

1 个答案:

答案 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);
    }
};
...

供参考:$http$q