0

次の問題があります。

私はループを持っています:

// Code A
. . .
for (var key in dict){
    // Code B
    . . . 
    var list = this.initializeList();
    var selfRef = this;

    jQuery.ajax({
        dataType: 'json',
        url: '/someUrl',
        data: {'sent_data': sendData},
        success: function (recievedData){
            this.function(list);
        }
    });

    // Code C
    . . . 
}
// Code D
. . .

ここで、コードの実行順序が次の場合に理想的な方法は次のとおりです。

  1. コード A
  2. for ループ:
    • コード B
    • AJAX
    • コード C
  3. コード D

しかし、問題はループのステップ 2 にあります。最初にコード Bが実行され、次に AJAX 呼び出しが実行され、次に再びコード Cの代わりに AJAX コードが実行されます。次の反復では、コード Bの代わりに AJAX コードが再度実行されます。実行の順序が上記のリストに示されているとおりであることは、私にとって非常に重要です。ご覧のとおり、変数リストはループごとに再初期化する必要がありますが、代わりに、最初の初期化のみで複数の AJAX 呼び出しを行っています。

これを修正するにはどうすればよいですか?

4

2 に答える 2

3

AJAX (その名前が示すように) は非同期です。つまり、特定の順序で実行されません。代わりに、サーバーが最初の呼び出しに応答するとすぐに AJAX 呼び出しが実行されます。これを修正するためにできることは、関数に遅延を追加するか、AJAX 呼び出し内にコールバックを追加して、AJAX 呼び出しが完全に実行された後にのみコードが実行されるようにすることです。

コード D をコールバックに入れる例:

// Code A  
...

//run Code D if loop exhausted
var dCheckCount = 0;
function dCheck() { // will be called once for each ajax call
  dCheckCount++;
  if (dCheckCount === dict.length) { // # finished ajax calls = loop size
    // Code D
    ...
  }
}  

for (var key in dict) {  
  // Code B
  ...

  jQuery.ajax({
    dataType: 'json',
    url: '/someUrl',
    data: {'sent_data': sendData},
    success: function (recievedData){
        this.function(list);
        // Code C
        ...

        // check if can run Code D
        dCheck();
    }
  });

}
于 2013-05-20T14:05:41.830 に答える