0

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

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

4

3 回答 3

3

var progress_check = data.contents.progress;是局部变量,每次函数完成时它都变为零。将其更改为progress_check = data.contents.progress;并检查。

于 2013-05-16T17:34:20.133 回答
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();
}

它将您的轮询抽象为一个返回“承诺”的函数。

然后,您可以观察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 属性以查找当前进度值。

于 2013-05-16T17:36:54.847 回答
0

使用javascript计时器发出ajax请求,每30秒/60秒进行一次进度跟踪请求
这将比做while循环更好

于 2013-05-16T17:35:06.347 回答