.ajax()调用成功'直到上一个.ajax()调用完成后才能完成
.ajax() call won't complete until previous .ajax() call is complete?
所以,我正在为CSV处理脚本制作进度条。dnc_scrubber.php
通过CSV并根据数据库检查电话号码,在单独的文件中返回匹配和不匹配的数据。lines.php
返回要处理的行总数,而progress.php
返回已处理的行数。我使用这两个数字来创建jQuery的progressbar函数所完成工作的百分比。
我的问题是doProgressBar()
中的第一个.ajax()
调用直到对dnc_scrubber.php
的调用完成才完成。为了澄清,当在Chrome中查看网络监视器时,会在向dnc_scrubber.php
发出请求的同时向lines.php
发出请求,但直到dnc_scrubber.php
完成运行后才会收到响应。以下是相关代码:
$('#progressbar').progressbar();
$.ajax({
url: 'dnc_scrubber.php',
type: 'POST',
async: true,
data: querystring,
success: function(){
for (i = 0; i < files.length; i++){
$('#complete').append('<a href="process/MATCHED - ' + files[i] + '">MATCHED - ' + files[i] + '</a><br />');
$('#complete').append('<a href="process/SCRUBBED - ' + files[i] + '">SCRUBBED - ' + files[i] + '</a><br />');
}
}
});
function doProgressBar(){
$.ajax({
url: 'lines.php',
async: true,
dataType: 'json',
complete: function (rez) {
lines = JSON.parse(rez.responseText);
lines = parseInt(lines.lines);
console.log('dpg1 - lines: ' + lines);
$.ajax({
url: 'progress.php',
async: true,
dataType: 'json',
complete: function (rez1) {
prog = JSON.parse(rez1.responseText);
prog = parseInt(prog.progress);
console.log('dpg2 - lines: ' + lines + ' prog: ' + prog);
if (lines > prog){
var bar = (prog / lines) * 100;
var bar = Math.round(bar);
$('#progressbar').progressbar('option', 'value', bar);
setTimeout(doProgressBar(), 1000);
console.log('dpg3 - lines: ' + lines + ' prog: ' + prog + ' bar: ' + bar);
} else if (lines == prog){
$('#progressbar').progressbar('option', 'value', 100);
console.log('dpg3 - lines == prog');
}
}
});
}
});
}
setTimeout(doProgressBar(), 100);
这是正常功能吗?我想做的是不可能的吗?我不知所措。。。提前感谢的帮助
编辑:lines.php
session_start();
header('Content-type: application/json');
echo json_encode(array('lines' => $_SESSION['lines']));
progress.php
session_start();
header('Content-type: application/json');
echo json_encode(array('progress' => $_SESSION['lines_processed']));
CSV处理器在每行检查过程结束时将$_SESSION['lines_proccessed']
增加一
很可能,您的服务器将每个用户的并发连接数限制为1。或者,您正在使用会话,而第一个脚本已将其锁定。第二个脚本将被阻止,直到第一个脚本释放对会话文件的锁定。如果需要,只使用session_start()
,并在使用完session_write_close()
后立即释放锁定。
编辑:我不确定这是否有效,但你可以尝试一下。每次你想更新会话时,请调用session_start()
,更新会话,然后调用session_write_close()
。我不确定你是否被允许在一个脚本中多次这样做,但它似乎应该起作用。
不确定这是否是问题的确切原因,但这是需要解决的问题。
更改
setTimeout(doProgressBar(), 100);
至
setTimeout(doProgressBar, 100);
您正在立即调用doProgressBar,而不是在超时完成之后。
Ajax将是assync。
lines.php
可能正在等待dnc_scrubber.php
,因为第一个已经锁定MySQL。
这只是猜测,因为我们没有您的PHP代码,但尝试手动运行这两个PHP脚本,并检查lines.php
是否没有等待MySQL完成。
当用PHP代码读取.csv文件时,它会锁定文件吗?那么,如果它必须读取两次,那么它只会在前一个代码关闭流时读取它?
如果打开两个浏览器并同时运行代码,会发生什么情况?两个浏览器是否同时执行并得到相同的结果?还是有人在等文件?
- 阻止在select2单击时调用ajax
- 调用Ajax并返回响应
- Ajax:只在元素存在的情况下调用Ajax
- PHP,MySQL,AJAX-调用AJAX结果后,Bootstrap CSS样式不会显示
- 调用Ajax内部的函数
- 无法获取属性'的值;拆分'在IE8中调用ajax之后
- 我们如何在Firefox中调用AJAX
- Rails:通过调用Ajax重定向
- Cookie 在 Spotify (Javascript) 中调用 ajax 后未保存
- 通过调用 Ajax 来设置 struts bean 值
- 无法从服务器中的 php 调用 Ajax 函数
- 如何在附加表行时调用 ajax
- 在facebook用户发送邀请请求后调用ajax调用
- 定期调用Ajax
- 调用Ajax生成的表单的值
- 无法调用ajax函数
- 在调用AJAX之后显示ng控制器的内容;作为“;作用
- CSS,Java脚本在php中调用ajax后无法正常工作
- 成功调用AJAX后,Toast Growl不会出现
- 如何在调用AJAX时记录或捕获信息和错误