在AngularJS上获取$ http响应错误状态

时间:2016-10-31 11:12:01

标签: angularjs

我参加了AngularJS的在线课程,我正在学习它的第一步。

我尝试在表单提交后调用API并基于API响应,显示并隐藏一些数据。

我首先尝试做的是检查状态响应,以防它为无效的API调用返回500错误。但是,我似乎无法做到。

我的服务文件的一部分:

  service.getMenuItem = function (shortName) {

    return $http.get(ApiPath + '/menu_items/' + shortName + '.json')
    .then(function successCallback(response) {
      return response.data;
    }, function errorCallback(response) {
      return response.status;
    })
  };

在我的控制器上:

SignupController.$inject = ['MenuService'];
function SignupController(MenuService) {
  var signupCtrl = this;

  signupCtrl.submit = function () {
    signupCtrl.response = MenuService.getMenuItem(signupCtrl.user.favouritedish);
    if ( signupCtrl.response == 500 ) {
      signupCtrl.dishError = true;
    }
  };
}

如果我在$ http调用中没有任何错误,那么一切正常。但是,由于500错误,它似乎没有。我尝试在我的控制器上记录signupCtrl.responsevalue: 500就在那里。但是if无法验证。

AngularJS的1.5.8版

3 个答案:

答案 0 :(得分:4)

您的getMenuItem函数返回一个promise,而不是已解析的值。 所以只需使用"然后"在它上面,检查已解决的值。

$('.outerLabel').on("click", function() { allowLabelClick(this); });

希望有所帮助。 顺便说一下,这段代码可能令人困惑,因为" 500"可能是一个" response.data"合法的回应。 因此,最好不要提出错误"回调并让调用服务自己处理错误。 e.g。

MenuService.getMenuItem(signupCtrl.user.favouritedish).then(
   function(response) {
      if (response === 500) {
         signupCtrl.dishError = true;
      }
   }
);

答案 1 :(得分:1)

使用.then()链接方法调用服务函数。

SignupController.$inject = ['MenuService'];

    function SignupController(MenuService) {
      var signupCtrl = this;

      signupCtrl.submit = function() {

        MenuService.getMenuItem(signupCtrl.user.favouritedish)
          .then(function(result) {
            console.log(result.data)
          }, function(error) {
            console.log(error.data)
          })
      };
    }

答案 2 :(得分:0)

$http服务不会返回承诺。它将返回其successerror的回调函数。所以你的服务应该是这样的:

function getMenuItem() {

            var deferred = $q.defer();

            $http.get(serviceBase + '/api/itemId').success(function (result) {
                deferred.resolve(result);
            }).error(function (err) {
                deferred.reject(err.status);

            });
            return deferred.promise;
        }

所以在这种情况下,如果成功,您将解析结果。或者如果失败,您将解决状态。

在您的控制器中,您应该执行以下操作:

SignupController.$inject = ['MenuService'];
function SignupController(MenuService) {
  var signupCtrl = this;

  signupCtrl.submit = function () {
    signupCtrl.response = MenuService.getMenuItem(signupCtrl.user.favouritedish).then(function(response){

    //to do if it success
    }, function(errorStatus){
     signupCtrl.dishError = true;
    // to do with the error status
  };
}