我对ajax请求有一点疑问
如果我发送了几个AJAX请求,是否会以相同的顺序收到回复? 接收req1,req2然后接收req1的响应,然后接收req2的响应。 是否有可能首先收到req2的响应?
我没有存储column_index值,当我收到回复时, 它会拾取正确的column_index吗?
代码:
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();
}
}
});
}
答案 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');