我的问题是,在完成所有其他请求之前,不会加载带有jQuery进度条<div>
的{{1}}。
这周围有吗?我想将dnc_scrubber.html
的内容更改为进度条,并在#tabs-1
正在执行其工作时为其设置动画。
dnc_scrubber.php
和lines.php
文件用于计算progress.php
完成工作的百分比 - 它会随着时间的推移更新会话。 dnc_scrubber.php
和lines.php
返回会话变量。
files.php
我已尝试在$('#tabs-1').load('dnc_scrubber.html', function() {
var querystring = 'col=' + col + '&' + makeQS(files);
var lines = 0;
$('#progressbar').progressbar();
$.ajax({
url: 'dnc_scrubber.php',
type: 'POST',
async: true,
data: querystring,
complete: 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 />');
}
}
});
$.ajax({
url: 'lines.php',
async: true,
dataType: 'json',
complete: function(json) {
lines = json.total;
}
});
function setProgress() {
if (prog < lines) {
prog = getProgress();
$('#progressbar').progressbar('option', 'value', prog);
setTimeout(setProgress(), 1000)
} else {
$('#progressbar').progressbar('option', 'value', 100);
}
}
var prog = getProgress();
setTimeout(setProgress(), 1000);
});
请求的回调函数中加载进度条,.ajax()
设置为async
。发生相同的结果 - 在false
完成之前,进度条未加载到#tabs-1
。
我该怎么办?
答案 0 :(得分:2)
你的setTimeout应该包含在一个函数中;如所写,这是一个语法错误:
setTimeout(function() { setProgress(); }, 1000);
你没有getProgress()函数,但至少对我来说,似乎progress.php调用应该是IN函数,因为它是没有道理的。我的假设是,对lines.php的ajax调用返回行数(文件),进度是到目前为止处理的数字,那应该更新进度条?您还应该处理100行的处理百分比与文件数的百分比。因此,如果您有40个文件,并且到目前为止处理了10个,那么它将显示25个进度(40除以10为25)。这允许您将setProgress()函数简化为“prog”,然后在结束时自动达到100:
function setProgress(){ var prog = getProgress(); //执行progress.php ajax调用 $('#progressbar')。progressbar('option','value',prog); if(prog <100){ setTimeout(function(){setProgress();},1000); } }
2A每秒移动一个ajax调用进行处理:
function getProgress() {
var lines = 0;
$.ajax({
url: 'progress.php',
async: false,
data: '{}',
dataType: 'json',
success: function(json) {
lines = json.total;
}
});
return lines;// should be 0 to 100 to show progress percent
};
使用complete:
而非success:
- 即使您收到错误也会完成整个过程,但成功不会,并且您不会在完整函数中捕获错误。
您对scrubber的调用没有数据类型,因此它假定为json,您是否真的要将查询字符串附加到url字符串并将数据空为:data: '{}',
?由于您没有列出makeQS()
函数,这是一个疯狂的假设。
您对lines.php的调用没有数据,在某些情况下可能会导致问题。在那里放一个空的data:'{}',
。
您的文件数组处理效率不高:
success: function() {
var fileLength = files.length;//assumes files does not change, keeps loop from a lookup on every loop.
for (var i = 0; i < fileLength; i++) {
var myMatch = 'MATCHED - ' + files[i];//better string handling - do one time only
var myScrub = 'SCRUBBED - ' + files[i];
$('#complete').append('<a href="process/' + myMatch + '">' + myMatch + '</a><br />');
$('#complete').append('<a href="process/' + myScrub + '">' + myScrub + '</a><br />');
}
}
您有许多全局变量,这通常不是一个好习惯。例如“col”,“files”,“lines”。
setProgress中的“setTimeout”未使用分号正确终止。