2017-09-27 9 views
1

支払額がゼロより大きい場合、繰り返し実行するwhileループが必要です。しかし、コードを実行するとブラウザがクラッシュします。Whileループ内のAjaxがJavascriptでクラッシュする

var amount = Number($('#payment1').val()); 
while (amount > 0){ 
    $.ajax({ 
     type: "POST", 
     url: baseurl + "collection/getSingleAmort", 
     data: {'contractid':contractID}, 
     success: function(result){ 
      var data = jQuery.parseJSON(result); 
      console.log(data); 
      var amortizationAmount = Number(data['amortization'][i].amortization_amount); 
      amount = amount -amortizationAmount; 
     }, 
     error: function (errorThrown){ 
      //toastr.error('Error!', 'Operation Done'); 
      //console.log(errorThrown); 
     } 
    }); 
} 
+2

の追加は、Ajaxは非同期であることを忘れないでください。素朴なループではなく、次の呼び出しに移る前に、Ajax呼び出しが戻って新しい値を返すのを待つ必要があります。このようにして、右の混乱を起こすか、あなたが言うように、大規模なループや何十回ものAjaxコールを実行しようとするとクラッシュすることになります。 – ADyson

+1

Ajaxレスポンスを待つように強制するコールバック関数を実装するだけです..... –

+0

皆さん、皆さんのご協力に感謝します。私は "async:false"を私のajaxに追加し、すべてうまくいきました。多くの尊敬! – Azis

答えて

0

async:false

var amount = Number($('#payment1').val()); 
while (amount > 0){ 
    $.ajax({ 
     type: "POST", 
     url: baseurl + "collection/getSingleAmort", 
     data: {'contractid':contractID}, 
     async:false, 
     success: function(result){ 
      var data = jQuery.parseJSON(result); 
      console.log(data); 
      var amortizationAmount = Number(data['amortization'][i].amortization_amount); 
      amount = amount -amortizationAmount; 
     }, 
     error: function (errorThrown){ 
      //toastr.error('Error!', 'Operation Done'); 
      //console.log(errorThrown); 
     } 
    }); 
} 
+0

ありがとうございます。これはトリックでした!とても有難い。 – Azis

+0

これが悪い考えである理由はhttps://xhr.spec.whatwg.org/#synchronous-flagを参照してください。 – ADyson

+1

これは実際には悪い考えですが、すぐに解決するには、回避策が見つかるまで機能します。私は強大なデータequestsでこれを使用しないことを強くお勧めします。 –

1
function xyz(amount){ 
    $.ajax({ 
     type: "POST", 
     url: baseurl + "collection/getSingleAmort", 
     data: {'contractid':contractID}, 
     success: function(result){ 
      var data = jQuery.parseJSON(result); 
      console.log(data); 
      var amortizationAmount = Number(data['amortization'][i].amortization_amount); 
      amount = amount -amortizationAmount; 

      if(amount>0) 
       xyz(amount); 
     }, 
     error: function (errorThrown){ 
      //toastr.error('Error!', 'Operation Done'); 
      //console.log(errorThrown); 
     } 
    }); 
} 

var amount = Number($('#payment1').val()); 
xyz(amount); 

このような何かを試してみてください。ループの代わりに再帰が使用されます。

+1

これは受け入れられる回答でなければなりませんIMO – ADyson

+0

これは良い答えです。しかし、私のコードにasync:falseを追加すると修正されました。それはクラッシュしませんでした。それは要求がなされるのには時間がかかりませんでした。 – Azis

関連する問題