2017-08-05 33 views
0

進行中のhttp取得リクエスト中(ページが完全にロードされる前)に単一ページの角度アプリケーションで、ページをリロードすると、すべてのhttpリクエストのerrorcallbackが呼び出されます。私はGoogle Chromeを使用します。 下のコードをhtmlファイルに保存し、問題の再現のために開いた直後にページをリロードしてください。 これは、呼び出されているすべてのAPIからのアラートを表示するため、ページ全体がブレークします。 保留中のHTTPリクエストが50件ある場合、httpリクエスト中にページをリロードすると50件のエラーアラートが表示されます。http getのerrorCallBack機能からアラートを削除する必要はありません。すべてのajax http要求が完了した後にページをリロードすると、エラーは表示されません。 この問題を回避するのを手伝ってください。保留中のhttpリクエスト中に角度の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アプリケーション:

+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ハンドラが再スローエラーに失敗しhttps://codemachin.github.io/gameofthrones/、それ成功した約束を拒否約束を変換します。


一つのアプローチアラートの数を減らすことである単一拒否ハンドラを提供するために、$q.allを使用することです。 $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; 
    }); 
} 

約束のいずれかが拒否して決済される場合には、得られた約束は最初の拒絶約束の拒絶値で拒否されます。

この例では、更なる連鎖に使用できる約束を返して、allHousesの機能を改善しています。

+0

あなたの解決策を試してみましたが、それは助けになりませんでした。全く同じで。ページが完全に読み込まれる前にページをリロードすると、Google Chromeで保留中のすべてのhttp get呼び出しのエラーが表示されます。 –

+0

回答の更新を参照してください。 – georgeawg

+0

ジョージのおかげで、間違いなく多くの地獄でエラーの数を減らすことができます。私は今のところそれを使用していますが、私はリロードが意図的であるため、単一の警告を表示しないより優れたソリューションを探しています。また、コンソールログに新しいタイプのエラーが発生しています..... VM491 angular.min.js:118 オブジェクト{data:null、status:-1、config:Object、statusText: ""、headers:function} ......これは共通の問題ですか、私はインターネット上で適切な解決策を見つけることができないので、私はそれに直面している唯一の人です –

関連する問題