Подтвердить что ты не робот

В службе 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

Почему это неправильно?

4b9b3361

Ответ 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.
  });