2016-04-01 5 views
-1

$ .eachループ内で成功関数(ajax)の値を取得する際に問題があります。各ループのjQuery ajax

私はこのような何かを持っている:

var test = []; 
$.each(images, function(index){ 
    var formData = new FormData(); 
    formData.append('image', images[index]); 

    $.ajax({ 
     url: 'http://localhost/admin/api/offers/upload_photo', 
     data: formData, 
     cache: false, 
     contentType: false, 
     processData: false, 
     type: 'POST', 
     beforeSend: function(){ 
      console.log(test.length);    
      test.push(images[index]);  
     }, 
     success: function(){ 
      console.log(test.length); 
     } 
    }); 
}); 

そしてbeforeSendの出力が細かい(コンソールログ:0、1、2)動作しますが、もう一つは3回3(コンソールログを返します。3、 3,3)。残りは問題なく動作し、私はそれだけで苦労します。私を助けることができる人はいますか?ありがとう!

+1

は、正確に何をすべきかのようです。 –

+0

あなたの 'each'ループは' success'関数のいずれかが起動する前に終了したようです。したがって、反復のうちの1つに対して「成功」が発生するまでに、ループは完了し、テストの長さは3である。これは参考になるかもしれません:[非同期呼び出しからの応答を返すにはどうすればいいですか?](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call ) – showdev

+0

その理由は、ajaxはasyncです:)その名前は次のようになります:) –

答えて

0

デフォルトでは、AJAXリクエストは非同期です。つまり、サーバーに要求を送信しますが、コードを続行する前に応答が返るのを待つことはありません。したがって、$.each()ループは3つのAJAX要求をすべて送信し、すべてのbeforeSend:関数をただちに実行します。 success:関数は応答が処理されるまで実行されません。これは、コードがメインブラウザのイベントループに戻るまで有効になりません。

すべての応答が処理される前にすべてのbeforeSend:関数が実行されるため、success関数が実行されると、test配列はすべての画像で塗りつぶされます。だから彼らはすべてtest.length == 3と表示されます。

+0

ありがとう、私はAJAXが正確に仕事を要求し、私の目標に達した方法を理解しました。 – BociucH

関連する問題