javascript while循环不工作(无限循环)

时间:2013-05-16 17:31:20

标签: javascript ajax jquery getjson

尝试使用$ .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>

不确定我做错了什么。提前谢谢。

3 个答案:

答案 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秒进行一次进度跟踪请求 这比循环

更好