2013-04-05 3 views
3

나는 모든 ajax 호출에서 사용하는 $ http에 대한 일반적인 호출을 포함하는 서비스를 가지고 있습니다. 여기서 상태 코드 결과가 리디렉션되는 "중앙 집중식"오류 처리 기능이 있습니다.AngularJS 다른 장소에서 다른 오류 코드를 처리하십시오.

"FieldsSync"서비스 :

return $http({ 
    method: 'POST', 
    url: url, 
    data: $.extend(defaultPostData, postData) 
}).error(function(data, status) { 
    switch (status) { 
     case 401: // "Unauthorized". Not logged in. 
      redirect.toLoginPage(); 
      break; 
     case 403: // "Forbidden". Role has changed. 
      redirect.toLogoutPage(); 
      break; 
    } 
}); 

결과를해야 오류를 처리 할 수 ​​이상의 오류 콜백를 연결하는 내가 항상 할 수 있도록 지연 개체를 반환 컨트롤러에서 서비스 기능 중 하나를 호출 사용자에게 어떤 종류의 피드백이 있습니다.

컨트롤러 :

fieldsSync.createField(newField).success(function(data) { 
    ... 
}).error(function(data, status) { 
    switch (status) { // <--- DO NOT WANT 
     case 401: 
     case 403: 
      return; // These errors are handled (=redirects) in the generic error callback and we don't want to show do anything while it redirects. 
    } 
    ... // "Individual" error handling. =Displaying messages and stuff 
}); 

그러나 리디렉션 내가 상태 코드가 이미 처리 된 경우 오류 콜백을 종료 할 필요가 발생하기 전에 오류 메시지가 팝업 싶지 않기 때문에.

질문 : 컨트롤러의 스위치 케이스를 제거하려면 어떻게합니까? 특정 오류 코드가 처리되었을 때 오류 콜백 체인을 종료 할 수 있습니까? 또는 덜 우스운 방법으로이 문제를 해결할 수 있습니까? :)

이것은 내게있어서 다시 발생하는 문제이며, 내 마음이 고착 된 것 같습니다.

$ http 또는 $ q에서 문서를 확인하고 이에 대한 예쁜 해결책을 찾았습니다.

+0

왜 당신이 원하는 할 수 원하는 방식을 개선 할 수 있습니다 그렇게하려면 누군가가 특정 오류 상태를 다시 처리하고 싶다면 –

+0

리디렉션이 발생하고있어 몇 밀리 초 동안 팝업이 표시되고 사라지는 경우 매우 좋지 않습니다. 나는 401과 다른 리디렉션을하는 지점을 보지 못합니다. –

답변

1

나는 당신이 그 사건을 처리하는 responseInterceptor를 사용하여 제안한다.

http://docs.angularjs.org/api/ng $ HTTP

나는 당신과 같은 "문제"를했을 때 나는 다음을 썼다. 그것의 단지 초안,하지만 당신은 당신의 특정 InternalServerErrorService가 처리 할 수 ​​

InternalServerErrorResponseInterceptor = function($q, InternalServerErrorService) { 
    return function(promise) { 
     return promise.then(function(response) { 
      return response; 
     }, function(response) { 
      if (response.status > 499) { 
       InternalServerErrorService.handleError(); 
       return $q.reject(response); 
      } 
      return $q.reject(response); 
     }); 
    }; 
}; 
module.factory('InternalServerErrorResponseInterceptor', ['$q', 'InternalServerErrorService', InternalServerErrorResponseInterceptor]); 
module.config(['$httpProvider', function($httpProvider) { 
     $httpProvider.responseInterceptors.push('InternalServerErrorResponseInterceptor'); 
    }]); 

이제 여러분의 필요에 당신이 :) 처리

관련

0

하나의 해결책은 동기화 함수 (puh!)를 다시 실행하여 지연된 객체를 반환하지 않도록하는 것입니다. 서비스 내부의 함수는 콜백을 인수로 취할 수 있습니다. 그런 다음 호출되기 전에 오류가 이미 일반 오류 처리로 처리되었는지 확인할 수 있습니다.

의사 코드 :

서비스 :

fieldsSync.createField(newField, successCallback, failCallback) { 
    ... 
    genericErrorHandlerResultingInRedirects() 
    if (not 401 || 403) { 
     failCallback() 
    } 
}; 

컨트롤러 :

fieldsSync.createField({}, function successCallback(){}, function failCallback(){ 
    /* Handle errors that should give the user feedback */ 
}); 

다른 솔루션은 가장 환영합니다.

관련 문제