0

Я не могу обернуть голову, когда $ q/$ http должен запустить блок onReject.

Скажем, у меня есть основной вызов:

$http.get('/users') 
    .then(function(res) { 
    return res.data; 
    }, function(err) { 
    console.log(err); 
    }); 

Если я получаю 500 Internal Server Error я собираюсь закончить в onSuccess блоке. Из моего скудного понимания обещаний, я думаю, это кажется правильным, потому что я технически получил ответ? Проблема является onSuccess блок кажется, что неправильное место, чтобы иметь кучу

if(res.status >= 400) { 
    return $q.reject('something went wrong: ' + res.status); 
} 

Просто так, что мой onReject блок получит пробег. Так оно и должно работать? Большинство людей обрабатывают 400+ статусов в блоке onSuccess или же они возвращают отклоненное обещание, чтобы заставить блок onReject? Не хватает ли я лучшего способа справиться с этим?

Я пробовал делать это в httpInterceptor, но я не мог найти способ вернуть отклоненное обещание отсюда.

this.responseError = function(res) { 
    if(res.status >= 400) { 
    // do something 
    } 

    return res; 
}; 
+0

Если есть код ошибки 400+, то ваш блок успеха не будет хитом. Он будет вызывать ваш обработчик ошибок – rob

+3

[На самом деле я уверен, что это не так) (https://github.com/angular/angular.js/blob/18a2e4fbfc44216c31bbcdf7705ca87c53e6f1fa/src/ng/http.js#L235-237) , – Bergi

+1

Скорее всего, у вас есть 'httpInterceptor' для' responseError' - наличие перехватчика означает, что вы «обработали» ошибку (если вы явно не возвращаете $ q.reject'), что приводит к успешному обработчику для '$ http' –

ответ

1

Ваш блок успеха не пострадает. Попробуйте это и увидеть, что ошибок блок ударит, если код ошибки> 300.

$http.get('/users').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. 
    }); 
0

Вы могли бы справиться с этим в перехватчика, а не в вашей функции обратного вызова.

В вашем app.config вы можете настроить ваш $ httpProvider на что-то вроде этого:

$httpProvider.interceptors.push(['$q', function ($q) { 
    return { 
     request: function (config) { 
      //do something 
      return config; 
     }, 
     responseError: function (response) { 
      if (response.status === 401) { 
       //handle 401 
      } 
      return $q.reject(response); 
     } 
    }; 
}]);