В службе angular $http, Как я могу уловить "статус" ошибки?
Я читаю книгу под названием "Pro Angular JS".
Однако у меня есть вопрос о том, как поймать статус ошибки.
Что я кодировал:
$http.get(dataUrl)
.success(function (data){
$scope.data.products = data;
})
.error(function (error){
$scope.data.error=error;
console.log($scope.data.error.status); // Undefined!
// (This is the spot that I don't get it.)
});
Если я код "console.log($ scope.data.error.status);", почему аргумент console.log имеет значение undefined?
В книге есть предложение: "Объект, переданный функции ошибки, определяет статус и свойства сообщения".
Итак, я сделал $scope.data.error.status
Почему это неправильно?
Ответы
Ответ 1
Ваши аргументы неверны, ошибка не возвращает объект, содержащий статус и сообщение, он передавал их как отдельные параметры в порядке, описанном ниже.
Взято из angular docs:
- data - {string | Object} - тело ответа, преобразованное функциями преобразования.
- status - {number} - код состояния HTTP для ответа.
- headers - {function ([headerName])} - функция получателя заголовка.
- config - {Object} - объект конфигурации, который использовался для генерации запроса.
- statusText - {string} - текст ответа HTTP-ответа.
Итак, вам нужно изменить свой код на:
$http.get(dataUrl)
.success(function (data){
$scope.data.products = data;
})
.error(function (error, status){
$scope.data.error = { message: error, status: status};
console.log($scope.data.error.status);
});
Очевидно, что вам не нужно создавать объект, представляющий ошибку, вы можете просто создать отдельные свойства области, но применяется тот же принцип.
Ответ 2
Методы долгосрочного обещания $http
success
и error
устарели. Вместо этого используйте стандартный метод then
. Взгляните на документы https://docs.angularjs.org/api/ng/service/ $http
Теперь правильный способ использования:
// Simple GET request example:
$http({
method: 'GET',
url: '/someUrl'
}).then(function successCallback(response) {
// this callback will be called asynchronously
// when the response is available
}, function errorCallback(response) {
// called asynchronously if an error occurs
// or server returns response with an error status.
});
Объект ответа имеет следующие свойства:
- data - {string | Object} - тело ответа, преобразованное функциями преобразования.
- status - {number} - код состояния HTTP для ответа.
- headers - {function ([headerName])} - Функция получения заголовка.
- config - {Object} - объект конфигурации, который использовался для генерации запроса.
- statusText - {string} - текст ответа HTTP-ответа.
Код состояния ответа от 200 до 299 считается статусом успеха и приведет к вызову обратного вызова успеха.
Ответ 3
ОБНОВЛЕНО:
Что касается угловых значений 1.5, обещают методы успеха и ошибки. (см. этот ответ)
из текущие документы:
$http.get('/someUrl', config).then(successCallback, errorCallback);
$http.post('/someUrl', data, config).then(successCallback, errorCallback);
вы можете использовать функцию других аргументов следующим образом:
error(function(data, status, headers, config) {
console.log(data);
console.log(status);
}
см. $http docs:
// Simple GET request example :
$http.get('/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.
});
Ответ 4
Из официальной angular документации
// Simple GET request example :
$http.get('/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.
});
Как вы можете видеть, первым параметром для обратного вызова ошибки являются данные, статус второй.
Ответ 5
Так как $http.get
возвращает "обещание" с дополнительными методами удобства success
и error
(которые просто обертывают результат then
), вы должны использовать (независимо от вашей версии Angular),
$http.get('/someUrl')
.then(function success(response) {
console.log('succeeded', response); // supposed to have: data, status, headers, config, statusText
}, function error(response) {
console.log('failed', response); // supposed to have: data, status, headers, config, statusText
})
Не совсем ответ на вопрос, но если вас укусит "моя версия Angular отличается от проблемы с документами", вы всегда можете сбрасывать все arguments
, даже если вы не хотите, t знать соответствующую подпись метода:
$http.get('/someUrl')
.success(function(data, foo, bar) {
console.log(arguments); // includes data, status, etc including unlisted ones if present
})
.error(function(baz, foo, bar, idontknow) {
console.log(arguments); // includes data, status, etc including unlisted ones if present
});
Затем, основываясь на том, что вы найдете, вы можете "исправить" аргументы функции для соответствия.
Ответ 6
Состояние ответа появляется как второй параметр в обратном вызове, (из документов):
// Simple GET request example :
$http.get('/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.
});