【问题标题】:TypeError: Cannot read property 'success' of undefined using $httpTypeError:无法使用 $http 读取未定义的属性“成功”
【发布时间】:2015-10-21 05:23:48
【问题描述】:

我正在为 http 通信创建一个服务,我需要一些方法来返回一个值.. 但是当我调用成功时出现类型错误;(..

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

我正在寻找两个答案之一:

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

【问题讨论】:

  • 你想得到什么回应?如果帖子成功了是吗?
  • 添加代码最后一行“return apiService;”
  • Gio Perez // 我想获取 JSON 数据,有时会出现错误

标签: jquery angularjs http callback typeerror


【解决方案1】:

创建factory 时,需要返回Object。您的工厂apiService 返回undefined

添加此行return apiService


更新

为什么会出错?

您收到此错误是因为当您调用 apiService 时,它会调用另一个 async 函数 idCheck。同时,在函数apiService,这里:

return $http[method](url, param);

没有返回apiService。相反,它正在返回匿名函数:

function(res) {
    return $http[method](url, param);
})

所以,apiService 的返回值为undefined

如何解决?

手动创建一个 deferred/promise 对象:

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

【讨论】:

  • 对不起我忘了写“return apiService” 然后在最后一行添加代码“return apiService;” 但是错误是一样的
猜你喜欢
  • 1970-01-01
  • 2019-05-16
  • 1970-01-01
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 2019-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多