2013-06-13 16 views
61

Làm cách nào để xử lý lỗi HTTP, ví dụ: 500, khi sử dụng AngularJS "http get sau đó" xây dựng (hứa hẹn)?Xử lý lỗi trong AngularJS http sau đó tạo

$http.get(url).then(
    function(response) { 
     console.log('get',response) 
    } 
) 

Vấn đề là, đối với bất kỳ phản hồi HTTP nào không phải 200, hàm bên trong không được gọi.

Trả lời

128

Bạn cần phải thêm một tham số bổ sung:

$http.get(url).then(
    function(response) { 
     console.log('get',response) 
    }, 
    function(data) { 
     // Handle error here 
    }) 
+9

Cũng lưu ý rằng đối tượng 'phản ứng' ở trên có: dữ liệu, tình trạng, tiêu đề, cấu hình, statusText. Đối tượng 'dữ liệu' ở trên có: dữ liệu, trạng thái, cấu hình, statusText. (Có các quy tắc đặc biệt về việc liệu statusText có được thông qua - trình duyệt, di động hay không, máy chủ web, v.v.) – OzBob

+0

Cũng lưu ý: 'data.config.url' chứa đầy đủ ** url + params ** , trong trường hợp bạn đã nhập thông số bên cạnh url –

13

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

$http.get(url).success(successCallback).error(errorCallback); 

Thay successCallback và errorCallback với chức năng của mình.

Chỉnh sửa: Câu trả lời của Laurent chính xác hơn khi xem xét anh đang sử dụng then. Tuy nhiên, tôi để lại điều này ở đây như là một thay thế cho những người sẽ ghé thăm câu hỏi này.

+9

Điều đáng nói đến là điều này không làm tương tự như câu trả lời của Laurent. '.then()' trả về một lời hứa. '.success()' và '.error()' thì không. –

+4

@ james-brewer: Để chính xác hơn, '.then()' trả về một lời hứa ** mới **. '.success()' và '.error()' không, cả hai đều trả về lời hứa ban đầu được cung cấp bởi 'get (url)'. – dod

+8

Điều quan trọng là phải nhớ rằng các cuộc gọi lại 'thành công' và' lỗi' đối với $ http api sẽ không còn được dùng nữa. –

3

Nếu bạn muốn xử lý lỗi máy chủ trên toàn cầu, bạn có thể muốn đăng ký một dịch vụ đánh chặn với $ httpProvider:

$httpProvider.interceptors.push(function ($q) { 
    return { 
     'responseError': function (rejection) { 
      // do something on error 
      if (canRecover(rejection)) { 
       return responseOrNewPromise 
      } 
      return $q.reject(rejection); 
     } 
    }; 
}); 

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

+0

Tôi nghĩ bạn đã phạm sai lầm ở đó. Để xử lý các lỗi đáp ứng, bạn cần phải tạo ra một bộ đánh chặn phản hồi không phải là một bộ chặn đánh chặn yêu cầu như bạn đã làm. – djd

+0

Thiết bị chặn đối với góc là cả yêu cầu và phản hồi kể từ 1.1.x. – mlaccetti

39

Bạn có thể thực hiện nhiều bit này sạch hơn bằng cách sử dụng :

$http.get(url) 
    .then(function (response) { 
     console.log('get',response) 
    }) 
    .catch(function (data) { 
     // Handle error here 
    }); 

Tương tự như @ this.lau_ answer, cách tiếp cận khác.

+1

Tôi hoàn toàn sẽ đi cho giải pháp này. – charliebrownie

+3

nó phải được chấp nhận câu trả lời, bởi vì '.error()' phương pháp không làm việc với 500 lỗi! Hãy chấp nhận. – saike

+2

Giải pháp tốt nhất sau khi 'thành công' và' xóa' bị xóa trong v1.6.0 –

2

Hãy thử điều này

function sendRequest(method, url, payload, done){ 

     var datatype = (method === "JSONP")? "jsonp" : "json"; 
     $http({ 
       method: method, 
       url: url, 
       dataType: datatype, 
       data: payload || {}, 
       cache: true, 
       timeout: 1000 * 60 * 10 
     }).then(
      function(res){ 
       done(null, res.data); // server response 
      }, 
      function(res){ 
       responseHandler(res, done); 
      } 
     ); 

    } 
    function responseHandler(res, done){ 
     switch(res.status){ 
      default: done(res.status + ": " + res.statusText); 
     } 
    }