Angularjs 如何对$http调用进行正确的错误处理?

Angularjs how to do proper error handling for $http call?

提问人:rolinger 提问时间:6/25/2021 更新时间:6/27/2021 访问量:37

问:

我的控制器为空或数据从服务传回,这反过来又导致控制器中出现错误,因为无法处理结果。我正在重读有关错误处理的材料,并开始怀疑我的错误处理是否不完整。由于我的控制器正在获取响应,但响应为空/未定义,这意味着我的服务仍在传回错误的响应。但根据我的服务,我认为应该用 .如何解决此问题,以便我的服务正在处理错误并仅将正确的数据传回控制器?undefinedundefinedcatch

控制器:

.controller('listCtrl', function($scope,listService) {

listService.getList(1)
.then(function(res) {
  if (res.list!= null) {   // <--- `Exception: Cannot read property 'list' of undefined`
     ...
     ...
  } else {
     ...
     ...
  }
}) ;

服务:

.factory("listService", function($http,$q) {
  // errMgmt 5100

  var headers={} ;
  var listMain = [] ;  // Current Lists
  var listPast = [] ;  // Past Lists


  function setVars() {
    baseUrl = "https://api.mydomain.com/v1/index.php" ;
    headers = {
      'Pragma':'no-cache', 
      'Expires': -1, 
      'Cache-Control':'no-cache,no-store,must-revalidate', 
      'Content-Type' : 'application/json',        
      'X-Requested-With':'com.mydomain',
      Authorization: 'Token ' +clientToken
    } ;
  }
      

  function getList(typeID) {
    if (typeID == 1) {
      listMain = [] ;
    } else if (typeID == 2) {
      listPast = [] ;
    }
    setVars() ;
    var dataObj = [{"type":typeID,"userID":userData.user_ID}] ;
    var req = {
      method: 'POST',
      url: baseUrl,
      timeout:httpTimeout,
      headers: headers,
      data: JSON.stringify(dataObj)
    }
     return $http(req)
    .then(function(response){
      if (typeID == 1) {
        listMain = response.data[0] ;  <-- Error happening, but being processed in success
        return listMain ;
      } else if (typeID == 2) {
        listPast = response.data[0] ;
        return listPast ;        
      }
    }).catch(function(err) {
      var msg = setError(err) ;
      errMgmt("services/getList",5100,msg) ;
    });
  }

  return {
    getList: function(typeID) {  // typeID : 1=current lsit, 2=past list
      return getList(typeID) ;
    }
 })

我读过各种各样的东西,但引起我注意的是,我的服务可能需要定义为:

return $http(req) {
.then(function(success) {   
   // success response
},function(error1) {
   // error response
}).catch(error2) {
   // catch all
}) ;

如果是这种情况,那么与每个过程之间到底有什么区别 - 每个过程具体是什么?function(error1).catch(error2)

angularjs 异步 ionic-framework 错误处理 回调

评论


答:

0赞 Thomson Mixab 6/27/2021 #1

尝试使用 success() 和 error() 调用$http

.factory("listService", function($http,$q) {
  // errMgmt 5100

  var headers={} ;
  var listMain = [] ;  // Current Lists
  var listPast = [] ;  // Past Lists


  function setVars() {
    baseUrl = "https://api.mydomain.com/v1/index.php" ;
    headers = {
      'Pragma':'no-cache', 
      'Expires': -1, 
      'Cache-Control':'no-cache,no-store,must-revalidate', 
      'Content-Type' : 'application/json',        
      'X-Requested-With':'com.mydomain',
      Authorization: 'Token ' +clientToken
    } ;
  }
      

  function getList(typeID) 
  {
    if (typeID == 1) {
      listMain = [] ;
    } else if (typeID == 2) {
      listPast = [] ;
    }
    setVars() ;
    var dataObj = [{"type":typeID,"userID":userData.user_ID}] ;
    var req = {
      method: 'POST',
      url: baseUrl,
      timeout:httpTimeout,
      headers: headers,
      data: JSON.stringify(dataObj)
    }

    $http(req).success(function(data, status) 
    {
    if (status == 200) 
    {
      alert(data);
      if (typeID == 1) {
        listMain = data ;  
        return listMain ;
      } else if (typeID == 2) {
        listPast = data;
        return listPast ;        
      }       
      
    }
    }).error(function(data) 
    {
      alert(data);
    });   
  }

  return {
    getList: function(typeID) {  // typeID : 1=current lsit, 2=past list
      return getList(typeID) ;
    }
 })