2017-01-06 5 views
1

私はforループ内でAJAXリクエストを呼び出していますが、コールバック関数でiterating変数を使用することを期待していますが、呼び出し元の値は保持されません現在の値それが正常に動作していますjQuery - 成功コールバックのAJAXリクエストで変数を使用

for (i = 1; i <= numRisks; i++){ 
    var id = window.localStorage['dbIDRisk'+i]; 
    if ($.isNumeric(id)){ 
     $.ajax({ 
      type: "POST", 
      encoding:"UTF-8", 
      url:'https://www.example.com/myscript.php', 
      data: someXdata, 
      success: function (data) { 
       window.localStorage['Risk'+i+'PDF'] = 1; 
      } 
     }); 
    } 
} 

、唯一の問題は、localStorageをラインがwindow.localStorage['Risk1PDF'] = 1;であろうと、たとえば、反復変数i = 1場合は、私が期待する、ということですが、代わりにそれはwindow.localStorage['Risk2PDF'] = 1;です。ですから質問は、window.localStorage['Risk'+i+'PDF'] = 1;の成功コールバックにiの値を保持するにはどうすればいいですか?

答えて

1

ここでIIFEを使用して値を保存する必要があります。

for (i = 1; i <= numRisks; i++) { 
 
    var id = window.localStorage['dbIDRisk' + i]; 
 
    if ($.isNumeric(id)) { 
 
    // Start the IIFE here. 
 
    // The value of i is packed inside this function. 
 
    (function (i) { 
 
     $.ajax({ 
 
     type: "POST", 
 
     encoding: "UTF-8", 
 
     url: 'https://www.example.com/myscript.php', 
 
     data: someXdata, 
 
     success: function(data) { 
 
      window.localStorage['Risk' + i + 'PDF'] = 1; 
 
     } 
 
     }); 
 
    })(i); 
 
    // End the IIFE here. 
 
    } 
 
}

時までに、AJAX要求は、ここでi値の変更を処理しています。それをIIFEで包んで与える方が良いです。また、同期データと非同期データを処理する場合は、非常に注意する必要があります。外部のiの値は同期しています。 AJAXは、サーバーが応答するといつでも実行できます。時には、ループ全体のAJAXコードが同時に実行されることもあります。インデックス変数を囲むImmediately-Invoked Function Expression、最もシンプルで読みやすい方法を使用して

0

for (i = 1; i <= numRisks; i++) { 
    var id = window.localStorage['dbIDRisk' + i]; 
    if ($.isNumeric(id)) { 
    (function (i) { 
     $.ajax({ 
     type: "POST", 
     encoding: "UTF-8", 
     url: 'https://www.example.com/myscript.php', 
     data: someXdata, 
     success: function(data) { 
      window.localStorage['Risk' + i + 'PDF'] = 1; 
     } 
     }); 
    })(i); 
    } 
} 

もう一つの方法は、let keyword.ES6がvarベースの変数とは異なるスコープされ、新たなletキーワードを導入し使用することです。たとえば、letベースのインデックスを持つループでは、ループ内の各反復では、ループ内で各値がスコープされているiの新しい値が設定されるため、コードは期待通りに機能します。

for (let i = 1; i <= numRisks; i++){ 

} 

もう1つの方法はclosuresです。

続きを読むhere.

+0

これは私の回答とどのように違うのですか? –

関連する問題