$http.get для обработки двух разных вызовов

Я пытаюсь вызвать конечную точку с помощью $http.get и проверить, равен ли код успеха 200, а затем использовать данные ответа, иначе мне нужно вызвать другую конечную точку. Я попытался проверить, является ли вызов успешным или ошибочным, как показано ниже,

    $scope.getRequest = function () {
        var url = $rootScope.BaseURL;
        var config = {
            headers: {
                'Authorization': `Basic ${$scope.key}`,
                'Prefer': 'odata.maxpagesize=10000'
            }
        };
        $http.get(url, config)
            .success(
            function (response) { // success async
                $scope.viewRequest.data = response.data;
            })
            .error(function (response) { // failure async
                var url = $rootScope.diffURL;
                $http.get(url, config)
                    .success(
                    function (response) { // success async
                        $scope.viewRequest.data = response.data;
                    })
                    .error(function (response) { // failure async
                        console.log("There was an error getting the request from CORE");
                    });
            });
    };

Я надеялся, что если вызов $scope.BaseURL потерпит неудачу, он перейдет к функции ошибок и вызовет $scope.diffURLreturns ответ, но я получаю ниже ошибки

angular.js:14800 TypeError: $http.get(...).success не является функцией

GET https:\\example.com\... 400 (Bad Request)

Возможно необработанное отклонение: {"data":{"error":{"code":"1001","message":" Свойство, используемое в выражении запроса, не определено в типе 'T'."}},"status":400,"config":{"method":"GET","transformRequest": [null],"transformResponse":[null],"jsonpCallbackParam":"обратный вызов","заголовки":{"Авторизация":"Базовый 0h","Предпочтение":"odata.maxpagesize=10000","Принять": "application/json, text/plain, /"},"url":"https://example.com...,"statusText":"Неверный запрос","xhrStatus":"complete"}`

Как я могу подойти к этому. введите здесь описание изображения


person trx    schedule 23.07.2019    source источник
comment
Опечатка: .sucess не .success.   -  person    schedule 23.07.2019
comment
.success действителен до 1.3, используйте then(), если ваша версия angular js выше 1.3   -  person Naga Sai A    schedule 23.07.2019
comment
@NagaSaiA Я пытался использовать .then, но не знаю, как проверить, успешен ли вызов, чтобы я мог позвонить в другую конечную точку. Можете ли вы показать мне, как я могу сделать с .then   -  person trx    schedule 23.07.2019
comment
@Эми, спасибо. Но даже при успехе я получаю ту же ошибку.   -  person trx    schedule 23.07.2019
comment
Я бы не ожидал, что исправление этого одного дефекта решит все дефекты в вашем коде, особенно 400 BAD REQUEST.   -  person    schedule 23.07.2019
comment
@ Эми Я понимаю, так как это плохой запрос, я хочу посмотреть, успешен он или нет, и перейти к другой конечной точке.   -  person trx    schedule 23.07.2019
comment
$http.get(url, config).then((ответ) => console.log(ответ), (ошибка) => console.log(ошибка));   -  person Naga Sai A    schedule 23.07.2019
comment
попробуйте протестировать с помощью console.logs для отладки   -  person Naga Sai A    schedule 23.07.2019
comment
@NagaSaiA Я вижу ошибку в журналах, как я могу адаптировать ее к моему сценарию. Я новичок в javascripting, любая помощь приветствуется   -  person trx    schedule 23.07.2019
comment
@trx, опубликован ответ, обрабатывающий второй API при ошибке   -  person Naga Sai A    schedule 23.07.2019


Ответы (2)


Чтобы добиться ожидаемого использования ниже, можно использовать вариант цепочки вызовов API с $http.get с then вместо success , поскольку он используется для Angularjs версии 1.3 и выше 1.3, используйте .then()

$http.get('<url>')  // Replace url, url2 with actual urls
   .then(function(response){

   }, function(error){
     $http.get('<url2>')
   .then(function(response2){
      // Handle response
   }, function(error2){

   }
   })

образец рабочего кода для справки

var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope, $http) {
$scope.main= '';
  $http.get("https://output.jsbin.com/http-promise-chain-json/14.json") //Invalid URL
  .then(function(response) {
console.log("success first call")
     $scope.main= response.data;
  }, function(error){
console.log("error")
    $http.get("https://output.jsbin.com/http-promise-chain-json/1.json")
  .then(function(response) {
      $scope.myWelcome = response.data;
  }, function(error) {
      
  })
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular.min.js"></script>
<body>

<div ng-app="myApp" ng-controller="myCtrl"> 

<h1>{{myWelcome}}</h1>
<h1>{{main}}</h1>

</div>

<script>

</script>

</body>

codepen – https://codepen.io/nagasai/pen/jgOgmV

person Naga Sai A    schedule 23.07.2019
comment
Это все еще работает, если у вас есть `$scope.myWelcome = response.data;`, не прокомментированный под недопустимым вызовом URL? - person trx; 23.07.2019
comment
нет, он не будет выполняться, так как он недействителен и перейдет к части обработки ошибок и сделает другой вызов, просто для примера, я использовал его и прокомментировал - person Naga Sai A; 23.07.2019
comment
Я добавил консоль только для справки, и она будет видеть только консоль ошибок, а не журнал консоли - первый вызов успешен, так как он потерпел неудачу - person Naga Sai A; 23.07.2019
comment
Да. Не всегда первый вызов завершается ошибкой, моя проблема в том, что если первый вызов будет успешным, мне нужно восстановить данные. Если нет, то перейдите к другому вызову. Если у меня есть $scope.myWelcome = response.data;, он просто не существует - person trx; 23.07.2019
comment
в случае успеха он обновит $scope.main (который я изменил, чтобы различать) с помощью response.data , перед обновлением с помощью response.data инициализируйте $acope.main некоторым значением по умолчанию, таким как пустая строка, ноль, чтобы показать его, когда это доступно - person Naga Sai A; 23.07.2019
comment
Вы обновили? - person trx; 23.07.2019
comment
@trx, обновленный с начальным значением для $scope.main и для тестирования, укажите действительный URL-адрес для первого вызова - person Naga Sai A; 23.07.2019
comment
Ценю вашу помощь. Спасибо - person trx; 23.07.2019

Вы можете использовать метод $http then

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

Или вы можете использовать обещания

function getRequest1(url) {  // This will return a promise object, also you can reuse this method for make subsequent request
    return $http.get(url)
        .success(function(data) {
            return data;
        });
}

Вы можете использовать свой первый метод следующим образом

var getRequest2 = function() {
      let url1 = "first url";
      getRequest1(url1)
      .success(function(data) {            
          //If the "getRequest1()" method is success you will get the result here
          console.log("Data from success function of getRequest1()", data);
      })
      .error(function() {
         // If getRequest1() method fail you can call fallback url from here
         var url2 = "second url";
         getRequest1(url2)
            .success(function(data) {            
              //If the "getRequest1()" method is success you will get the result here
              console.log("Data from success function of getRequest1()", data);
            })
            .error(function() {

            }
      });
};
person Syam    schedule 23.07.2019
comment
Могу ли я снова вызвать $http.get с помощью errorCallback()? - person trx; 23.07.2019
comment
Да, ты можешь сделать это - person Syam; 23.07.2019
comment
Не помогло. у меня не работает - person trx; 23.07.2019
comment
Я нашел хорошую статью о http-сервисах и обещаниях angularjs. Как только у вас будет время, просмотрите его weblog.west-wind.com/posts/2014/Oct/24/ - person Syam; 23.07.2019
comment
все еще получаю ту же ошибку? - person Syam; 23.07.2019