尝试使用$ .getJSON执行while循环以返回特定任务的进度。最初的$ .getJSON完美无瑕;但循环永远不会完成。我通过后端php文件传递某些变量,这是脚本中变量的原因。
$.getJSON('http://anyorigin.com/get?url=https://".$domain.".instructure.com/api/v1/courses/".$course_id."/course_copy/".$id."?access_token=".$token."&callback=?', function(data){
var progress = data.contents.progress;
alert(progress);
var elem = document.getElementById('".$id."');
elem.style.width = progress + '%';
});
var progress_check = 0;
//The part below doesn't work! //
do {
$.getJSON('http://anyorigin.com/get?url=https://".$domain.".instructure.com/api/v1/courses/".$course_id."/course_copy/".$id."?access_token=".$token."&callback=?', function(data){
var progress_check = data.contents.progress;
alert(progress_check);
var elem = document.getElementById('".$id."');
elem.style.width = progress_check + '%';
});
}
while (progress_check < 100);
我希望脚本使用新的css样式更新特定的div以正确显示加载栏。这是div:
<div id='".$id."-div' class='progress progress-striped active'>
<div id=".$id." class='bar' style='width: 1%'></div>
</div>
不确定我做错了什么。提前谢谢。
答案 0 :(得分:3)
你的var progress_check = data.contents.progress;
是局部变量,每次函数完成时它变为零。将其更改为progress_check = data.contents.progress;
并检查。
答案 1 :(得分:1)
$.getJSON
调用异步 - 在AJAX调用完成之前,结果尚不可知。此外,因为函数立即返回,它会尽可能多地激活多个AJAX并行调用 。最重要的是,您的progress
变量正在内部回调函数中覆盖,因此while
条件中同名的变量永远不会更新。
试试这个,而不是:
function poll(url) {
var def = $.Deferred();
(function loop() {
$.getJSON(url).done(function(data) {
var progress = data.contents.progress;
if (progress < 100) {
def.notify(progress);
loop();
} else {
def.resolve();
}
}).fail(def.reject);
)();
return def.promise();
}
将您的轮询抽象为一个返回&#34;承诺&#34;的函数。
然后,您可以在该承诺上观察progress
个事件,并观察循环的完成情况:
poll(myUrl).progress(function(percent) {
var elem = document.getElementById(...);
elem.style.width = percent + '%';
}).done(function() {
// this is called when the loop is finished
}).fail(function() {
// this is called if any of the AJAX calls break the loop
});
现在您的进度显示逻辑与AJAX代码完全分离,poll
函数中唯一的硬编码依赖项是查找当前进度值的JSON属性。
答案 2 :(得分:0)
使用javascript计时器发出ajax请求, 每隔30秒/ 60秒进行一次进度跟踪请求 这比循环
更好