2012-05-09 11 views
0

javascriptについての私の理解は、常にコードが順番に実行されているため、次の行は実行されるまで実行されません。jQueryのajax呼び出しに関してコード実行はどのように機能しますか?

私は、一連の質問を一度に試して保存しようとしていたので、次のようなことがあります。

for(var i = 1; i <= assessment_question_count; i++) 
    { 
     if(valid) 
     { 
      var sort = i; 
      $.ajax(
      { 
       type: "POST", 
       url: '/assessmentquestion/create', 
       data: 'assessment_id=' + assessment[1] + '&question_text=' + $('#assessment_question_text_' + sort).val() + '&assessment_question_type_id=' + 
        $('assessment_question_type_' + sort).val() + '&sort_order=' + i, 
       success: function (str) 
       { 
        var result = str.split('|'); 
        if (result[0] == 'success') 
        { 
         var message = '<br />Question saved '; 
         update_display_message(message); 
        } 
        else if(result[0] == 'fail') 
        { 
         valid = false; 
         var message = '<br />Error saving question '; 
        } 
        else 
        { 
         valid = false; 
         var message = '<br />Error saving question '; 
        } 
       } 
      }); 
     } 
    } 

私はに実行している問題は、完了するのを待っていない、とすぐにそれはAjaxの呼び出しを行うと、次のループ上に行くように見えるです。これを修正する方法はありますか?それで、これまでの更新まで次の質問を試みませんか?

編集:私は多分それが完了するまで自分自身を呼び出し続ける再帰的な方法でそれを固執すると思います。

+2

大きな質問は、すべての質問を1つのJSONペイロードに巻き込んで、1つのAJAXリクエストでサーバーに送信する理由です。 –

+0

@NickBork私はそれについて考えなかった、それを見てから、最善のアプローチのように思える。あなたが答えとしてそれを置くなら、私はそれを受け入れるとマークします。 – Jhorra

答えて

2

回、それがタスクを完了するために、サーバーへのラウンドトリップの数を削減することが最良である:

+0

私はこれをやり遂げ、それは素晴らしい仕事をした。 – Jhorra

2

デフォルトでは、XMLHttpRequestsはブラウザでは非同期です。あなたが本当にしたいのであれば、あなたのajaxオプションにasync: falseを設定することでそれを同期させることができますが、これはUI全体をロックするのでお勧めできません - そのリクエストが戻ってくるまで他のことは起こりません。

6

デフォルトではajax works asynchronouslyです。

asyncfalseに設定してください。

$.ajax(
      { 
       type: "POST", 
       url: '/assessmentquestion/create', 
       async: false, 
       etc... 
+1

したがって非同期javascriptとxml – xandercoded

+0

@ Xander確かに:) – Curt

+0

+1はOPのアプローチが賢明であるかどうかに関してあなたの2セントを与えないためです! – xandercoded

1

はい。 $.ajax()を呼び出すと、データが戻ったときに呼び出されるコールバック(success)を設定しています。間に待つ必要はありません。中断されるので、次のループに進みます。多くの場合、

async : false 
0

問題はAJAX呼び出しがあなたのAJAX呼び出しに以下を追加し、非同期的にその名の起こりです。あなたのケースでは、完了前に応答を待っている間にX個のリクエストを送信すると、ユーザーエクスペリエンスが悪くなる可能性があります。

私の意見では、データを配列またはJSONにセロライズし、コレクションセットを単一のデータエンティティとして投稿し、検証を行い、すべての検証エラーおよび/またはメッセージングニード。

これはクライアントサイドのコーディングに追加されるかもしれませんが、より信頼性の高いUIと優れたユーザーエクスペリエンスを提供する必要があります。

関連する問題