我有一个发送多个ajax请求的循环。
完成所有这些后,我想重新加载我的页面。
$.each(uuids, function (i, e) {
console.log("Sending request for: " + e)
$.ajax({
type: 'GET',
data: {
_rnd: new Date().getTime()
},
url: addToGroupUrl + '?label=' + encodeURIComponent($("#changeGroupSelect").val()) + '&labelDisplay=' + encodeURIComponent($("#changeGroupSelect option:selected").text()) + '&uuid=' + e,
dataType: 'json',
async: 'false',
});
});
location.reload()
现在我遇到了并非所有请求都出现的问题。循环创建所有请求,但是一旦完成location.reload(),服务器就会停止接收请求。
似乎async: 'false'
只准备请求,但它们被处理为异步。
我怎么想在这里思考?我想在发送所有请求后重新加载我的页面。
答案 0 :(得分:5)
首先,async
属性接受布尔值,而不是字符串,因此它应该是async: false
。
其次,更重要的是, 永远不会使用async: false
。用户体验是可怕的,因为它完全阻止了UI的更新并使浏览器看起来像崩溃了。
相反,所有请求都是异步的,并将所有的promises放在一个数组中,在完成所需的代码之前,可以apply
到$.when
。试试这个:
var requests = [];
var label = $("#changeGroupSelect").val();
var labelDisplay = $("#changeGroupSelect option:selected").text();
$.each(uuids, function (i, e) {
requests.push($.ajax({
type: 'GET',
data: {
_rnd: new Date().getTime(),
label: label,
labelDisplay: labelDisplay,
uuid: e
},
url: addToGroupUrl,
dataType: 'json'
}));
});
$.when.apply(this, requests).done(function() {
window.location.reload()
});
请注意,如果您向data
属性提供网址参数,则会自动为您编码。此外,由于输入的值在请求之间不会发生变化,因此您可以在循环之外抓取它们,以阻止在每次迭代中不必要地查询DOM。
答案 1 :(得分:1)