2017-08-05 54 views
0

在正在進行的http get請求期間(頁面完全加載之前)的單個頁面angular App中,如果我重新加載頁面,則調用所有http請求errorcallbacks。我使用谷歌瀏覽器。 將下面的代碼保存在html文件中,並在打開頁面後重新加載頁面以重現問題。 這打破了整個頁面,因爲它顯示了所有被調用的API的警報。 如果有50個掛起的http請求,我在http請求期間重新加載頁面時得到50個錯誤警報。我不想從http get的errorCallBack函數中刪除警報。如果我在所有ajax http請求完成後重新加載頁面,則它不會顯示任何錯誤。 請幫我解決這個問題。在掛起的http請求期間Angular js頁面重新加載錯誤

<div ng-app="iceApp" ng-controller="allCharacterController as myCharacter"> 

<input type="text" id="search1" ng-model="search.name"> 

    <div ng-repeat="book in myCharacter.character | filter : search"> 
    {{book.name}} 
    </div> 
</div> 

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.8/angular.min.js"></script> 
<script type="text/javascript"> 
var myApp = angular.module('iceApp', []); 

myApp.controller('allCharacterController',['$http',function($http) { 

var main = this; 
this.character=[]; 
this.baseUrl = 'https://www.anapioficeandfire.com/api/'; 

    // there were 50 pages to get data from thats why i have made a loop 


this.allCharacters = function(){ 
for(i=1;i<50;i++){ 

$http({ 
    method: 'GET', 
    url: main.baseUrl+"characters?page="+i+"&pageSize=50" 
    }) 
    .then(function successCallback(response) { 
     // this callback will be called asynchronously 
     // when the response is available 
     console.log(response.data); 
     if(response.data.length>0){ 
      main.character.push.apply(main.character,response.data); 
       } 


    }, function errorCallback(response) { 
     // called asynchronously if an error occurs 
     // or server returns response with an error status. 
     alert("some error occurred. Check the console."); 
     console.log(response); 
    }); 
    } 

}// end load all blogs 
    this.allCharacters(); 

}]) 
</script> 

ps:我對此很感興趣。請幫我解決它。以上是我爲重現問題所做的一個簡約問題。 實際的Web應用程序我一直在努力:https://codemachin.github.io/gameofthrones/

+0

謹慎使用警報和其他模式對話框,因爲它們具有破壞性。他們的突然出現迫使用戶停止當前的任務並專注於對話內容。有時這是一件好事,但大多數情況下它是不必要的,而且通常很煩人。**考慮替代方法,如內聯擴展和敬酒。 – georgeawg

+0

*我仍然在尋找更好的解決方案,因爲重新加載是故意的,所以它甚至不會顯示單個警報。*最簡單的解決方案是刪除警報。發生什麼錯誤以及爲什麼用戶需要中斷? – georgeawg

+0

之後我糾正了這個錯誤。我的意思是---我仍然在尋找一個更好的解決方案,因爲重新加載是故意的,所以**不會顯示單個提醒。 –

回答

0
BookService.getAllHouses([i]) 
.then(function successCallback(response) { 

    if(response.data.length>0){ 
     main.all.push.apply(main.all,response.data); 
      } 
}, function errorCallback(response) { 
    // called asynchronously if an error occurs 
    // or server returns response with an error status. 
    alert("some error occurred. Check the console."); 
    console.log(response); 
    //IMPORTANT 
    throw response; 
}); 

.catch的處理程序無法重新拋出一個錯誤,它轉換被拒絕的承諾,一個成功的承諾。


一種方法是降低警報的數量是用$q.all提供單一的拒絕處理。

this.allHouses = function(){ 
    var promiseList = []; 
    for(let i=1;i<12;i++){ 
     var promise = BookService.getAllHouses([i]) 
     .then(function onSuccess(response) {   
      if(response.data.length>0){ 
       main.all.push.apply(main.all,response.data); 
      } 
      return response.data; 
     }); 
     promiseList.push(promise) 
    }; 

    return $q.all(promiseList)  
     .catch(function onRejection(response) { 
      // called asynchronously if an error occurs 
      // or server returns response with an error status. 
      alert("some error occurred. Check the console."); 
      console.log(response); 
      throw response; 
    }); 
} 

隨着$q.all,如果任何承諾與拒絕結算,產生的承諾將與第一拒絕承諾的拒絕值拒絕。

本示例通過讓函數返回一個可用於進一步鏈接的承諾來改進allHouses函數。

+0

試過你的解決方案goerge,但它沒有幫助。一樣。如果我在頁面完全加載之前重新加載頁面,它會在谷歌瀏覽器中顯示來自所有掛起的http get調用的錯誤。 –

+0

查看更新以回答。 – georgeawg

+0

感謝喬治,這肯定會減少很多地獄的錯誤。我現在將使用它,但我仍在尋找更好的解決方案,因爲重新加載是故意的,所以甚至不會顯示單個警報。 VM491 angular.min.js:118 Object {data:null,status:-1,config:Object,statusText:「」,headers:function} ......這是一個普遍的問題,或者我是唯一面臨的問題,因爲我無法通過互聯網找到適當的解決方案 –

相關問題