繁体   English   中英

关于jQuery ajax调用,代码执行如何工作?

[英]How does code execution work in regards to the jQuery ajax call?

我对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调用后似乎会立即进入下一个循环,而不是等待它完成。 有没有办法修改它,以便在以前的更新之前不尝试下一个问题?

编辑:我在想,也许把它放在一个递归方法中,该方法会一直调用它直到完成。

默认情况下, ajax是异步工作的

async设置为false可以防止这种情况。

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

默认情况下,XMLHttpRequest在浏览器中是异步的。 如果您确实想要,可以通过在ajax选项中设置async: false使其同步,但这是不可取的,因为这会锁定整个UI-在该请求返回之前,几乎没有其他事情发生。

通常,最好减少往返服务器以完成任务的次数。 在您的情况下,在等待响应完成之前发送X个请求数量可能会带来糟糕的用户体验。

在我看来,最好将您的数据序列化为数组或JSON,然后将集合集作为单个数据实体发布,进行验证并以所有验证错误和/或带有消息传递的方式发送回JSON响应。

尽管这可能会增加客户端编码,但是您将需要这样做,它将提供更加可靠的UI和更好的用户体验。

是。 通过调用$.ajax() ,您可以设置一个回调( success ),该回调将在数据返回时调用。 无需在两者之间等待; 您会被打断,因此转到下一个循环。

问题是ajax调用是异步发生的,因此将其名称添加到您的ajax调用中:

async : false 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM