我确实有大量的ajax请求是通过onclick触发器发出的。
(可能接近30个请求)。
它看起来像这样:
if($(this).attr('id') == 'checkbox'){
var type = 'checkbox';
// loop over checkbox inputs and store in array 'checkboxarray'
var checkboxarray = [];
$(this).find('input').each(function(){
checkboxarray.push($(this).next('span').text());
});
}
else if($(this).attr('id') == 'dates'){
var type = 'dates';
var default_value = $(this).find('input').val();
}
else{
alert('Error: There has been an unknown extra iteration');
}
// Send as ajax call to be processed
$.ajax({
type: "POST",
url: "process.php",
data: "type="+type+"&default_value="+default_value+"&checkboxarray="+checkboxarray+,
success: function(html){
}
});
$("#processessing").show();
$('#outer_container').html('<br /><br />Processing…<br /><br />');
// once all of the requests stop, fire it off.
$("#processessing").ajaxStop(function(){
$(this).hide();
$('#outer_container').html('Saved');
function redirect(){
window.location = "page.php";
}
setInterval(redirect,500);
});
对于少量数据这是有效的,但是对于大量数据,很多都会丢失......有什么建议吗?
答案 0 :(得分:0)
如果您的事件被绑定到锚标记,那么您必须停止该页面跟随该链接。使用preventDefault():
$(function () {
$("a#foo").on("click", function (e) {
e.preventDefault();
// ajax requests continue here....
});
});
编辑好吧,因为那不是你的问题,它可能实际上与你产生的ajax线程的数量有关。浏览器在可以打开的连接数量方面有内置的上限(请参阅此处:How many concurrent AJAX (XmlHttpRequest) requests are allowed in popular browsers?)。我建议重构代码以减少请求。
答案 1 :(得分:0)
解决此问题的唯一可靠解决方法是保持计数你已解雇的多少ajax,并且在成功处理程序中,只有在最后一次ajax调用成功完成时才进行重定向。
你没有为我提供足够的代码来更具体地提出建议,但通常会这样:
// init global count to however many ajax calls you're going to do
var ajaxCnt = 30;
function doMyAjax() {
// Send as ajax call to be processed
$.ajax({
type: "POST",
url: "process.php",
data: "type="+type+"&default_value="+default_value+"&checkboxarray="+checkboxarray+,
success: function(html){
// when last ajax call completes redirect
--ajaxCnt;
if (ajaxCnt == 0) {
window.location = "page.php";
}
}
});
}
如果你事先知道你正在做多少ajax调用,那么将ajaxCnt初始化为该值可能会更安全(并且不会在doMyAjax()函数中增加它。另外,为了完整性,你应该处理ajax错误和也减少了ajax错误处理程序中的计数。