2013-06-13 2 views
61

Как я могу обработать ошибку HTTP, например. 500, при использовании AngularJS «http get then» построить (обещает)?Обработка ошибок в AngularJS http get then construct

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

Проблема в том, что для любого ответа HTTP не 200, внутренняя функция не вызывается.

ответ

128

Вам нужно добавить дополнительный параметр:

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

Заметим также, что 'ответ' объект выше имеет: данные, статус, заголовки, конфигурации, его статуса. Объект 'data' выше имеет: данные, статус, config, statusText. (Существуют специальные правила о том, передается ли статусText - браузеры, мобильные или нет, веб-сервер и т. Д.) – OzBob

+0

Также обратите внимание: 'data.config.url' содержит полный ** url + params ** , если вы передали параметры рядом с url –

13

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

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

Заменить successCallback и errorCallback с функциями.

Редактировать: Laurent ответил (а)но пользователем с помощью then. Тем не менее я оставляю это здесь как альтернативу для людей, которые посетят этот вопрос.

+9

Стоит отметить, что это не то же самое, что и ответ Лорана. '.then()' возвращает обещание. '.success()' и '.error()' не делают. –

+4

@ james-brewer: Чтобы быть более точным, '.then()' возвращает ** новое ** обещание. '.success()' и '.error()' не делают, оба возвращают исходное обещание, предоставленное 'get (url)'. – dod

+8

Важно также иметь в виду, что обратные вызовы 'success' и' error' для $ http api будут устаревать. –

3

Если вы хотите обрабатывать ошибки сервера по всему миру, вы можете зарегистрировать услугу перехватчика за $ httpProvider:

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

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

+0

Думаю, вы совершили ошибку. Чтобы обрабатывать ошибки ответа, вам необходимо создать ответный перехватчик, а не перехватчик запросов, как вы это делали. – djd

+0

Перехватчик для углового - это запрос и ответ от 1.1.x. – mlaccetti

39

Вы можете сделать это немного более чистым с помощи :

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

Как и на @ this.lau_ ответ, различный подход.

+1

Я бы полностью решил это решение. – charliebrownie

+3

необходимо принять ответ, потому что метод '.error()' не работает с 500 ошибками! Пожалуйста примите. – saike

+2

Лучшее решение после 'success' &' remove' удаляется в v1.6.0 –

2

Попробуйте

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); 
     } 
    }