0

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

我想做一个按钮来取消所有 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();
});

提前致谢

4

2 回答 2

0

就像 FAngel 所说,第一个长进程是阻塞其他请求!

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

谢谢 !

于 2012-12-24T21:13:49.623 回答
0

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

于 2012-12-24T14:53:50.637 回答