Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
循环不工作时的javascript(无限循环)_Javascript_Ajax_Jquery_Getjson - Fatal编程技术网

循环不工作时的javascript(无限循环)

循环不工作时的javascript(无限循环),javascript,ajax,jquery,getjson,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

尝试使用$.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);
$.getJSON('http://anyorigin.com/get?url=https://“$domain.”.instructure.com/api/v1/courses/“$course\u id.”/course\u copy/“$id.”?access\u token=“.$token.”回调=?”,函数(数据){
var progress=data.contents.progress;
警报(进度);
var elem=document.getElementById(““$id.”);
elem.style.width=progress+'%';
});
var进度检查=0;
//下面的部分不起作用//
做{
$.getJSON('http://anyorigin.com/get?url=https://“$domain.”.instructure.com/api/v1/courses/“$course\u id.”/course\u copy/“$id.”?access\u token=“.$token.”回调=?”,函数(数据){
var progress\u check=data.contents.progress;
警报(进度检查);
var elem=document.getElementById(““$id.”);
elem.style.width=进度检查+'%';
});
} 
同时(进度检查<100);
我希望脚本使用新的css样式更新特定的div,以正确显示加载栏。这是分区:

<div id='".$id."-div' class='progress progress-striped active'>
   <div id=".$id." class='bar' style='width: 1%'></div>
</div>


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

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

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

使用javascript定时器发出ajax请求, 每30秒/60秒进行一次进度跟踪请求

这比while-loop更好

使用javascript定时器发出ajax请求, 每30秒/60秒进行一次进度跟踪请求

这将比while循环更好。
$.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();
}

现在,您的进度显示逻辑与AJAX代码完全分离,
poll
函数中唯一的硬编码依赖项是查找哪个JSON属性以查找当前进度值。

$。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();
}

现在,您的进度显示逻辑与AJAX代码完全分离,
poll
函数中唯一的硬编码依赖项是查找哪个JSON属性以查找当前的进度值。

一致且清晰地缩进代码将在阅读代码时大大帮助您。也让那些试图帮助你阅读的人更容易阅读。恕我直言,该代码极难阅读。(我试图为您清理它,但似乎已关闭…)我甚至没有在您的代码中看到无限循环。您正在尝试在循环中执行一些您应该使用
setTimeout
执行的操作-JS是异步的,而不是多线程的。另外,我将在您的帖子中添加标签,并不是所有Javascript都是jQuery,您应该指定它。这是一种测试进度的可怕方式。如果浏览器在此之前没有阻止您,它可能会在完成一个ajax请求之前发出数千个ajax请求。它破坏了ajax的异步特性。您也没有在ajax外部更新变量(这就是为什么您的循环是无限的)@meagar的可能重复并非真正的重复-关键在于细节,解决这一问题的好方法不一定需要与该问题相同的答案。在阅读代码时,一致且清晰地缩进代码将极大地帮助您。也让那些试图帮助你阅读的人更容易阅读。恕我直言,该代码极难阅读。(我试图为您清理它,但似乎已关闭…)我甚至没有在您的代码中看到无限循环。您正在尝试在循环中执行一些您应该使用
setTimeout
执行的操作-JS是异步的,而不是多线程的。另外,我将在您的帖子中添加标签,并不是所有Javascript都是jQuery,您应该指定它。这是一种测试进度的可怕方式。如果浏览器在此之前没有阻止您,它可能会在完成一个ajax请求之前发出数千个ajax请求。它破坏了ajax的异步特性。您也没有在ajax外部更新变量(这就是为什么您的循环是无限的)@meagar的可能副本不是真正的副本-魔鬼在细节中,一个好的解决方案不一定需要与该问题相同的答案。正如一些OP评论中提到的,setTimeout是处理此问题的最佳方法。在更改和清理它之后,它非常简单。正如在一些OP注释中提到的,setTimeout是处理这个问题的最佳方法。在更换和清理之后,它非常简单。