2015-02-10 17 views
0

我正在訪問3個API並將其數據聚合到我的頁面上。目前,如果其中一個API調用失敗(可能是該網站處於脫機狀態),則停止執行並且該頁面不包含任何數據。如何處理與AngularJS的失敗API調用

我想繼續執行其餘的API調用,只是忽略那個無聲無息的調用。我怎樣才能做到這一點?

myApp.controller('homeController', function ($scope, $q, $http, $timeout) { 
    $scope.allTest = function() { 
     var first = $http.get('/api/drawings/'), 
      second = $http.get('/api/procedures/'), 
      third = $http.get('/api/sharepoint/'); 

     $q.all([first, second, third]).then(function (result) { 
      var tmp = []; 
      angular.forEach(result, function (response) { 
       tmp.push(response.data); 
      }); 
      return tmp; 
     }).then(function (result) { 
      $scope.combinedResult = result; // result in combinedResult 
     }); 
    }; 
}); 

回答

1

您需要正確的錯誤處理,這對於例如可以通過回調來完成,從而使

   $http.get('/api/drawings/').then(
        (response:ng.IHttpPromiseCallbackArg<any>) => { 
         success(response); 
        }, 
        (response:ng.IHttpPromiseCallbackArg<any>) => { 
         error(response); 
        } 
       ); 

如果成功 - 繼續執行,否則處理錯誤。

+0

我仍想繼續執行其他2個API調用並忽略錯誤(通過忽略我的意思是默默登錄或嘗試重新加載該API調用) – JeffC 2015-02-10 20:57:39

+0

在服務中包含這些API調用,所以不要直接調用它們控制器,通過服務調用,如你所說,將會處理和記錄失敗。當然,接下來的兩個電話也需要進行相同的處理,以便您可以隨時致電他們。所以它會是'apiService.retrieveDrawings','apiService.retrieveProcedures','apiService.retrieveSharepoint',並且每個'retrieve *'方法都會處理錯誤和日誌。 – vtor 2015-02-10 21:08:40

+0

這樣做!感謝您的指導。這工作得很好。我優雅地忽略服務中的離線或錯誤,有時會發生,並且仍將數據呈現給沒有錯誤的屏幕。 – JeffC 2015-02-11 02:31:14