2013-12-14 3 views
0

У меня есть директива о том, что я заказываю услугу, которая вызывает $http звонки на задний конец.

Как вы обрабатываете ошибки 404/401/HTTP в целом? Я ищу образец лучшей практики.

$http сожрает и отвергает обещание при попадании в сообщение об ошибке HTTP?

Это то, что я до сих пор, и это, кажется, работает нормально, но я не уверен, что я делаю рекомендуемый способ:

Услуги

app.service('helpService', ['$http', function ($http) { 
    return { 
     getHelpUrl: function (pageUrl) { 
      return $http.post('Home/GetHelpUrl', { pageUrl: pageUrl }); 
     } 
    } 
}]); 

Директива

app.directive('helpLink', ['$location', 'helpService', function ($location, helpService) { 
    return { 
     restrict: 'A', 
     replace: true, 
     scope: {}, 
     template: function (elem, attrs) { 
      return '<a ng-href="{{helpUrl}}" ng-show="showLink" target="_blank">Help?</a>'; 
     }, 
     link: function (scope, elem, attrs) { 
      scope.showLink = false; 

      helpService.getHelpUrl($location.path()).success(function (data) { 
       scope.helpUrl = data.helpUrl; 
       scope.showLink = true; 
      }); 
     } 
    } 
}]); 

ответ

1

Подобно методу success есть также метод error(function(data, status, headers, config) определен более $ http.

Это пример из документации

$http({method: 'GET', url: '/someUrl'}). 
    success(function(data, status, headers, config) { 
    // this callback will be called asynchronously 
    // when the response is available 
    }). 
    error(function(data, status, headers, config) { 
    // called asynchronously if an error occurs 
    // or server returns response with an error status. 
    }); 

Вы можете использовать его, чтобы поймать ошибки

1

Если вы хотите зафиксировать все ошибки, вы можете обратиться к перехватчикам. Посмотрите на documentation. Вы также можете использовать обратный вызов ошибки в вашем методе .then. (Это было бы заменить метод .success), так как $http возвращает обещание (см $ Q promise api):

Перехватчик может быть зарегистрирован что-то вроде:

app.config(function($httpProvider){ 
    $httpProvider.interceptors.push('connectionInterceptor'); 
}); 

app.factory('connectionInterceptor', function ($q) { 
    return { 
     'requestError':function(rejection){ 
      //do something general (global) 
      //send a rejection 
     }, 
     'responseError': function (response) { 
      //do something general (global) 
      //send a rejection 
     } 
    }; 
}); 
+0

в '.then' вы говорите, используя это как так:' .then (функция (successResult) { }, function (errorResult) {}); '? – Sam

+0

Да, см. Это [ссылка] (http://docs.angularjs.org/api/ng.$http) (раздел «Возвращает» прямо над «Методами») для структуры объекта «successResult» и «errorResult» – calebboyd

Смежные вопросы