Ajax请求在页面重定向之前未完成

时间:2011-11-29 22:15:45

标签: jquery

我确实有大量的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);
});

对于少量数据这是有效的,但是对于大量数据,很多都会丢失......有什么建议吗?

2 个答案:

答案 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错误处理程序中的计数。