【发布时间】:2014-11-21 14:06:04
【问题描述】:
我有一个 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 );
});
调用长时间运行的PHP脚本的脚本如下:
$.ajax({
url : "/modules/core.wages/ajax/wagesLines.ajax.php",
async : true,
type : "POST",
data: weeks,
dataType: "json",
success : function(d){
....
问题是,getScriptState() 实际上并没有与上述脚本异步运行。它实际上直到长时间运行的 ajax 调用完成前一毫秒才返回状态。
从我的控制台日志看,它似乎在长时间运行的脚本完成之前已经运行了两次,但这并没有反映在 DOM 中。
这是 chrome 中的网络时间线图片。显示 getState 被调用一次,然后运行工资线.ajax.php 的结果,然后再次运行 getState 几次。这几次实际上应该在工资线.ajax.php 之前,因为它还没有完成获取数据:
如此屏幕截图所示,问题在于所有对 getState.ajax.php 的调用都在运行,直到工资线.ajax.php 完成。所以无论 getState.ajax.php 是否只需要 100ms 执行,它都不会完成,直到 paysLines.ajax.php 完成。
有人有什么想法吗?
【问题讨论】:
-
可能是你服务器的连接数有限,所以轮询请求在长请求完成后排队执行?
-
您检查过状态测试返回的内容吗?
-
他们都返回了正确的 {"statusMsg":"Fetching paylines"}。直到 clearState.ajax.php 运行。 @derMrich 我的服务器也配置为允许多个连接。此外,正如您从我上面的屏幕截图中看到的那样,多个正在同时运行
-
我不明白这里使用
.ajaxStart()和.ajaxStop()是怎么回事。 edit 好吧,我想我会的。那么您是否将console.log()调用添加到状态检查“成功”方法以查看它何时运行?我认为,就其价值而言,从成功处理程序而不是从计时器开始下一次状态检查会更安全,以避免同时进行多个状态检查。 -
ajaxStart 和 ajaxStop 是在 ajax 调用开始和停止时运行的函数。无论它是由于成功还是错误而停止。所以当我启动一个ajaxcall时,我也启动了函数getScriptState