2017-10-19 20 views
0

forループでajaxをオーダー別に送信するにはどうすればよいですか?ここに私のコードは次のとおりです。オーダーごとにajaxリクエストを実行

function ajax_sent(i, btn){ 
    jQuery.ajax({ 
     url : ln_ajax_handle.ajax_url, 
     type : 'post', 
     data : { 
      action : 'ln_ajax_handle', 
      main_data : i 
     }, 
     success : function(result){ 
      jQuery('#ln-modal-bangchinh').append(result); 
      if(i === 5){ 
       btn.button('reset'); 
       jQuery('#ln-content-modal').modal('show'); 
      } 
     } 
    }); 
} 

jQuery(document).ready(function(){ 
    jQuery('.ln-update').click(function(){ 
     var btn = jQuery(this); 
     btn.button('loading'); 

     for(var i = 1; i <= 5; ++i){ 
      ajax_sent(i, btn); 
     } 
    }); 
}); 

そして、ここでは簡単なPHPのテスト関数である:

function ln_ajax_handle(){ 
    $data = $_POST['main_data']; 

    echo ln_alert_test($data); 

    wp_die(); 
} 

function ln_alert_test($data){ 
    ob_start(); 
    ?> 
    <div class="alert"> 
     <button type="button" class="close" data-dismiss="alert">&times;</button> 
     <strong>Success!</strong> The loop run by <?php echo $data; ?> times; 
    </div> 
    <?php return ob_get_clean(); 
} 

PHPファイルでは、私は簡単なテストを取得するためにechoを使用しています。しかし、結果は数字が画像のような順序で並べられていないことです。 enter image description here。私はi = 1が欲しいときに、サーバーから応答を受けると、i = 2が実行されます。次の進歩は同じです。これを行う方法は?

+5

は、あなたは順序で結果を受け取ることを保証することはできません。 –

+1

これをあなたのajax呼び出しに追加することで同期させることができます。 'async:false' – cmorrissey

+2

@cmorrisseyは正しいですが、ブラウザはすべてのAJAX要求が完了するまでロックされます。お勧めしません。 –

答えて

4

ajaxリクエストをチェーンする必要があります。これは、前のリクエストが終了した後に他のリクエストが開始されるようにします。 AJAXは非同期であるため、前のAJAX呼び出しのコールバックでのAJAX呼び出しを行う場合を除き

var i = 1, 
    fn = function() { 
    i <= 5 && ajax_sent(++i, btn, fn); 
    }; 

ajax_sent(i, btn, fn); 

// add a callback cb to be called on success 
function ajax_sent(i, btn, cb) { 
    jQuery.ajax({ 
    url: ln_ajax_handle.ajax_url, 
    type: 'post', 
    data: { 
     action: 'ln_ajax_handle', 
     main_data: i 
    }, 
    success: function(result) { 
     // if a callback was provided call it 
     cb && cb(); 
     jQuery('#ln-modal-bangchinh').append(result); 
     if (i === 5) { 
     btn.button('reset'); 
     jQuery('#ln-content-modal').modal('show'); 
     } 
    } 
    }); 
} 
+0

私は新しいJSですので、私は今あなたのコードを控えめにすることはできません。それは働いたが、問題がある。最初のリクエスト( 'i = 1 'のとき)は、次のリクエストが実行される前に2回実行されます。もう一度それを確認できますか? –

+1

私は答えを更新しました。私の間違い。私はi ++を使用していました。今は+ + iであり、関数呼び出しはすでにインクリメントされた値を受け取ります。 – bluehipy

+0

それは正常に働いた。大変ありがとうございました。あなたは多くの時間を節約しました。 –

関連する問題