2016-12-30 8 views
0

私は何か間違っているかどうかわかりませんが、JSの中では実際に使っていませんが、dbに行があるかどうかを5秒ごとにチェックしたいと思います条件が満たされていないときにajaxコールを使用します。javascript do whileがハングしてブラウザがメモリ不足になる

これは私の呼び出しです:エントリはデシベルで、それがモーダルポップアップを閉じますどのtrueにcheckForDocを設定しない場合は、存在する場合

var checkForDoc = false; 
      var i = 0; 
      do { 
       $timeout(function() { 
        $http({ 
         url: 'http://localhost:52876/api/Admin/CheckForDoc', 
         method: "POST", 
         async: false, 
         params: { loanID: $scope.loanIdPopup } 
        }).success(function (data, status) { 
         if (data === 'OK') { 
          checkForDoc = true; 
         } 
         else{ 
          i++; 
         } 

         if (i == 23) { 
          checkForDoc = true; 
         } 
        }).error(function (data, status) { 
         console.log(data); 
        }); 
       }, 5000); 

      } while (!checkForDoc); 

      if (checkForDoc) { 
       $uibModalInstance.close(); 
      } 

だから私は、5秒ごとにチェックしたいと思います。 2分後に行が存在しない場合はポップアップも閉じますが、最初に述べたように、デバッガのdo行に到達すると、ブラウザは応答を停止し、しばらくしてこのメ​​ッセージが表示されます enter image description here

感謝と幸せな休日の誰も

+0

私は、「while」ループを実行するたびに「健全性チェック」変数を追加することを常にお勧めします。 'while(何でも){sanityCheck ++; if(sanityCheck> 100)デバッガ。 *残りのループ*} 'このプラクティスは、ブラウザーのクラッシュからあなたを救うことができ、何が起こっているのかを調べることができるように問題点ですぐに一時停止します。 – machineghost

答えて

1

それは角度の$http()方法だと仮定すると、それはそのAJAX構成オブジェクトのプロパティasyncを受け付けません。したがって、あなたのコードは、ブラウザがちょうどあきらめるまで、何百もの別個のHTTP要求を起動させるタイトなループです。

それがうまくいっても、そのアプローチはかなり恐ろしい考えです。同期HTTPは、ネットワーク操作の進行中にブラウザが基本的にフリーズするため、悪いユーザーエクスペリエンスです。 $http()設定オブジェクトでタイムアウトをサポートしていますが、これがおそらく最善の方法です。

+0

Pointyが言ったこと! – Bindrid

+0

こんにちは@Pointy thx、withouy asyncと同じことを行うことはfalseと同じです。私が達成しようとしていることをどうすればいいのか、いくつかの例を教えてもらえますか?ありがとうございます – Laziale

+0

また、この関数/ CheckForDocのAPIにブレークポイントがありますが、その関数には全く到達していません。だから、do while条件が正しく書かれているかどうかはわかりません。ありがとうございました – Laziale

0

これは.successの条件をチェックし、満たされていない場合は5秒以内に発生します。

   var checkForDoc = false; 
        var i = 0; 

        function doCheck() { 

          $http({ 
           url: 'http://localhost:52876/api/Admin/CheckForDoc', 
           method: "POST", 
           async: true, 
           params: { loanID: $scope.loanIdPopup } 
          }).success(function (data, status) { 
           if (data === 'OK') { 
            if (checkForDoc) { 
             $uibModalInstance.close(); 
            } 
           } 
           else { 
            i++; 

            if (i < 23) { 
             setTimeout(function() { doCheck() }, 5000) 
            } 
           } 
          }).error(function (data, status) { 
           console.log(data); 
          }); 


        } 
        // set first clock 
        setTimeout(function() { doCheck(); }, 5000); 
関連する問題