Jquery 在ajax运行时设置轮询脚本不起作用
我有一个ajax脚本,有时需要10-30秒才能执行。在执行PHP文件期间,PHP脚本将会话参数设置为不同的状态。这背后的想法是让第二个ajax与第一个异步运行,以更新当前工作流 为此,我在ajaxStart和ajaxStop中使用以下命令: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",
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