如何阻止jQuery的任何进程来更改document.location

时间:2012-12-24 14:23:47

标签: jquery ajax abort

对于一个小项目,我有一个页面,我实现一个长时间请求(2分钟),1ms超时(只需要启动进程异步,我不需要任何备份),并且每个都调用一些AJAX 5秒。

我想按一个按钮来取消所有AJAX调用,并更改document.location。

我使用xhrPool脚本尝试取消所有AJAX调用,然后调用document.location行。但是,当我点击按钮时,脚本似乎被一些待处理的AJAX呼叫阻止,并且用户(我)需要等待大约20-30秒,太懒了。

有我的剧本:

$.xhrPool = [];
$.xhrPool.abortAll = function() {
    $(this).each(function(idx, jqXHR) {
        jqXHR.abort();
    });
    $.xhrPool = [];
};

$.ajaxSetup({
    beforeSend: function(jqXHR) {
        $.xhrPool.push(jqXHR);
    },
    complete: function(jqXHR) {
        var index = $.xhrPool.indexOf(jqXHR);
        if (index > -1) {
            $.xhrPool.splice(index, 1);
        }
    }
});

function toTime(c) {
    var str = '';
    if (c > 59) {
        str = Math.floor(c/60) + 'm ';
        c %= 60;
    }
    if (c > 0)
        str = str + c + 's';
    return str;
}

function updateProgress() {
    $('.progress .bar').animate({
        width: count*4
    }, {duration:1000, easing: 'linear'});
    $('.progress .bar').html(toTime(count));
}

function timer() {
    updateProgress();
    if (count > 0) {
        if ((count % 5) == 0) {
            $.ajax({
                url: '/?act=verifyStatus',
                timeout: 5000
            }).done(function(data){
            if (data == 'OK')
                document.location = '/?act=found';
            });
        }
    } else {
        document.location = '/?act=nodelivers';
    }
    count--;
    setTimeout('timer()', 1000);
}

$(function(){
    $('.cancel').click(function(){
        $.xhrPool.abortAll();
        document.location = '/?act=form';
    });
    $.ajax({
        url: '/?act=doContact',
        timeout: 1
    });
    timer();
});

先谢谢

2 个答案:

答案 0 :(得分:0)

只需添加一个按钮,将全局变量状态设置为“运行”或“停止”,并在每次调用之前检查该变量的状态?然后根据需要重定向。

答案 1 :(得分:0)

就像FAngel所说,第一个漫长的过程阻止了其他请求!

所以,在这个过程中,我刚刚添加了session_write_close();在上次访问会话之后,现在一切正常!

谢谢!