0

我对 javascript 的理解一直是代码是按顺序执行的,所以下一行要等到上一行执行后才会执行。

我有类似以下的东西,我试图用它来尝试一次保存一系列问题。

    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 异步工作

设置asyncfalse防止这种情况。

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

XMLHttpRequests 在浏览器中默认是异步的。如果您真的想要,您可以通过设置您的 ajax 选项使其同步async: false,但这是不可取的,因为这会锁定整个 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 回答