Ajax请求响应顺序

时间:2015-07-16 04:11:45

标签: jquery ajax

我对ajax请求有一点疑问

  1. 如果我发送了几个AJAX请求,是否会以相同的顺序收到回复? 接收req1,req2然后接收req1的响应,然后接收req2的响应。 是否有可能首先收到req2的响应?

  2. 我没有存储column_index值,当我收到回复时, 它会拾取正确的column_index吗?

  3. 代码:

    function make_ajax_call(column_index) {
        jQuery.ajax({
            url: site.adminajaxurl + '?action=display_items',
            type: 'POST',
            data: {
                id: dbase_header[column_index]
            },
            // dataType: "json",
            success: function(data) {
    
                // Until we get all responses hide the submit button
                jQuery('body')
                    .find('#submit_template_div')
                    .hide();
    
                // Store the html content received for a template
                data_html[column_index] = data;
    
                // Increase response count
                response_display_item++;
    
                // If all response received
                if (response_display_item == request_display_item) {
                    // Reset request count and update framework
                    response_display_item=0;
                    request_display_item = 0;
    
                    print_menu = 1;
                    update_framework();
                }
            }
        });
    }
    

3 个答案:

答案 0 :(得分:3)

1)对于异步请求,它取决于特定操作完成所需的时间。只有在操作完成后,客户才会收到响应。

如果您需要连续订购,那么您应该使用同步调用服务器。 如果您使用的是jquery.Ajax方法,则可以指定Async = false。

来自JQuery文档

  

Ajax中的第一个字母代表"异步,"意味着操作并行发生,并且不能保证完成顺序。 $ .ajax()的async选项默认为true,表示在发出请求后代码执行可以继续。强烈建议不要将此选项设置为false(从而使调用不再异步),因为它可能导致浏览器无响应。

答案 1 :(得分:0)

首先简短回答。

Q1订单无法保证(通常)

Q2是

1)除非你设置async: false,否则Ajax方法将异步执行。所以回调执行命令都取决于服务器端。 但是一旦你使用async: false选项,Javascript就无法做任何事情,直到你收到回复。这是用户觉得浏览器冻结的东西。 所以,如果你不想要"冻结"并保持你想要的顺序,在第一个ajax调用回调中调用next ajax。

2)由于在make_ajax_call内部调用了Ajax方法,因此ajax回调也有column_index的引用。每次拨打make_ajax_call时,javascript都会创建新的名称空间,这意味着即使您在另一个make_ajax_call方法运行时调用make_ajax_call,其回调也会引用其column_index

答案 2 :(得分:0)

订单无法保证。如果要使用异步,可以执行的操作是在请求中发送唯一键,然后在响应中包含该唯一键。

这是一个创建随机字符串的函数......

function randomString(length, chars) {
    var result = '';
    for (var i = length; i > 0; --i) result += chars[Math.round(Math.random() * (chars.length - 1))];
    return result;
}
var rString = randomString(32, '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');