Jquery 在ajax运行时设置轮询脚本不起作用

Jquery 在ajax运行时设置轮询脚本不起作用,jquery,ajax,Jquery,Ajax,我有一个ajax脚本,有时需要10-30秒才能执行。在执行PHP文件期间,PHP脚本将会话参数设置为不同的状态。这背后的想法是让第二个ajax与第一个异步运行,以更新当前工作流 为此,我在ajaxStart和ajaxStop中使用以下命令: function getScriptState(){ $.ajax({ url : "/modules/core.iris/ajax/getState.ajax.php", type : "GET",

我有一个ajax脚本,有时需要10-30秒才能执行。在执行PHP文件期间,PHP脚本将会话参数设置为不同的状态。这背后的想法是让第二个ajax与第一个异步运行,以更新当前工作流

为此,我在ajaxStart和ajaxStop中使用以下命令:

function getScriptState(){
    $.ajax({
        url : "/modules/core.iris/ajax/getState.ajax.php",
        type : "GET",
        dataType : "json",
        async : true,
        global: false,
        success : function (d){
            if( $('#statusMsg').length !== 0 ){
                if( typeof d.statusMsg !== "undefined" ){
                    $('#statusMsg').html( d.statusMsg );
                }
            }
        }
    });
}
function clearScriptState(){
    $.ajax({
        url : "/modules/core.iris/ajax/clearState.ajax.php",
        ...
    });
}
var loaderMsg = null;
$( document ).ajaxStart(function() {
    getScriptState();
    loaderMsg = setInterval( getScriptState, 500 );
});
$( document ).ajaxStop(function() {
    clearScriptState();
    clearInterval( loaderMsg );
});
调用longrunning PHP脚本的脚本如下所示:

$.ajax({
    url : "/modules/core.wages/ajax/wagesLines.ajax.php",
    async : true,
    type : "POST",
    data: weeks,
    dataType: "json",
    success : function(d){  
    ....
问题是,getScriptState()实际上并没有与上述脚本异步运行。实际上,在长时间运行的ajax调用完成前一毫秒,它才返回状态

从我的控制台日志来看,当它完成时,它似乎在longrunning脚本完成之前已经运行了两次,但这并不反映在DOM中

以下是chrome中的网络时间线图片。显示getState被调用一次,然后运行wageLines.ajax.php的结果,然后再次运行getState数次。这几次实际上应该在wageLines.ajax.php之前,因为它尚未完成数据的获取:

如本屏幕截图所示,问题在于对getState.ajax.php的所有调用都在运行,直到wagesLines.ajax.php完成。因此,无论getState.ajax.php执行只需要100毫秒,它都要等到wagesLines.ajax.php完成才能完成


有人有什么想法吗?

出现这个问题的原因是,两个被调用的脚本都试图访问同一个PHP会话

PHP默认情况下会锁定会话,直到脚本完成

可以通过使用
会话\u write\u close()
进行修复


参考:

可能到服务器的连接数量有限,因此轮询请求将在长请求完成后排队并执行?您是否检查了状态测试返回的内容?它们都返回了{“statusMsg”:“获取工资线”},这是正确的。直到运行clearState.ajax.php。另外@derMrich my server配置为允许多个连接。此外,正如您从我上面的屏幕截图中看到的,多个正在同时运行。我不明白在这里使用
.ajaxStart()
.ajaxStop()
是怎么回事。我想我会的。那么,您是否已向状态检查“success”方法添加了
console.log()
调用,以查看它何时运行?我认为,值得一提的是,从成功处理程序而不是从计时器开始下一次状态检查会更安全,以避免同时进行多个状态检查。ajaxStart和ajaxStop是ajax调用开始和停止时运行的函数。无论它是因为成功还是错误而停止。因此,当我启动ajaxcall时,我也会启动函数getScriptState