0

JavaScript についての私の理解は、コードが順次実行されるため、次の行はその上の行が実行されるまで実行されないということです。

一連の質問を一度に1つずつ保存しようとするために使用しようとしていた次のようなものがあります。

    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 呼び出しを行うとすぐに次のループに進むように見えることです。これを変更して、以前の更新まで次の質問を試行しないようにする方法はありますか?

編集:完了するまで自分自身を呼び出し続ける再帰メソッドに固執することを考えています。

4

5 に答える 5

6

デフォルトでは、ajax は非同期で動作します。

これを防ぐには、 に設定asyncします。false

$.ajax(
            {
                type: "POST",
                url: '/assessmentquestion/create',
                async: false,
                etc...
于 2012-05-09T15:35:41.443 に答える
2

XMLHttpRequests は、ブラウザーではデフォルトで非同期です。本当に必要な場合async: falseは、ajax オプションを設定して同期させることができますが、これはお勧めできません。これは、UI 全体をロックしてしまうためです。その要求が返されるまで、他にほとんど何も起こりません。

于 2012-05-09T15:35:29.793 に答える
2

多くの場合、タスクを完了するためにサーバーへの往復回数を減らすことが最善です。あなたの場合、完了する前に応答を待っている間に X 個の要求を送信すると、ユーザー エクスペリエンスが低下する可能性があります。

私の意見では、データを配列または JSON にシリアライズしてから、コレクション セットを単一のデータ エンティティとして投稿し、検証を行い、すべての検証エラーおよび/または必要なメッセージを含む JSON 応答を返すのが最善です。

これにより、クライアント側のコーディングが必要になる場合がありますが、より信頼性の高い UI と優​​れたユーザー エクスペリエンスが提供されます。

于 2012-05-09T20:09:05.987 に答える
1

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

于 2012-05-09T15:35:56.800 に答える
0

問題は ajax 呼び出しが非同期で発生することです。そのため、名前は ajax 呼び出しに次を追加します。

async : false 
于 2012-05-09T15:38:20.693 に答える