Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.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 jQueryAjax循环以刷新jQueryUI进度条_Javascript_Jquery Ui_Jquery - Fatal编程技术网

Javascript jQueryAjax循环以刷新jQueryUI进度条

Javascript jQueryAjax循环以刷新jQueryUI进度条,javascript,jquery-ui,jquery,Javascript,Jquery Ui,Jquery,我有一个jQueryUI进度条,它应该显示完成查询的百分比。Oracle有一个很好的系统表,可以让您查看需要10秒以上时间的操作。我试图对这个查询进行交错的$.ajax调用,以便刷新进度条 问题是,我可以让循环在没有任何等待时间的情况下发出rapid fire请求,或者只是延迟整个JavaScript的执行 我通过单击jQueryUI对话框中的“执行”按钮启动第一个请求 $("#dlgQuery").dialog({ buttons: { Execute: functio

我有一个jQueryUI进度条,它应该显示完成查询的百分比。Oracle有一个很好的系统表,可以让您查看需要10秒以上时间的操作。我试图对这个查询进行交错的$.ajax调用,以便刷新进度条

问题是,我可以让循环在没有任何等待时间的情况下发出rapid fire请求,或者只是延迟整个JavaScript的执行

我通过单击jQueryUI对话框中的“执行”按钮启动第一个请求

$("#dlgQuery").dialog({
    buttons: {
        Execute: function () {
            $(this).dialog("close");
            StartLoop();
        }
    }
});
我正在尝试构建
startoop()
函数,或者创建一个递归
GetProgress()
函数。理想情况下,我将使用一个公共变量
var isDone=false
作为何时终止循环或停止递归调用函数的指示器

为了简单起见,我刚刚创建了一个执行100次的静态循环:

function StartLoop(){
    for (var i = 0; i < 100; i++) {
        GetProgress();
    }
}
我发现,到目前为止:

setTimeout(GetProgress(),3000)
in
startoop()
冻结Javascript,并且对话框不会关闭(我假设,因为它将等待查询完成)

其中一个,
pausecomp(3000)
做了几乎相同的事情

如果我在AJAX请求的“success”函数中调用这两个函数中的任何一个,它都会被忽略(可能是因为它正在异步启动另一个调用)


我有点困在这里了,任何帮助都将不胜感激,谢谢。

我相信您要做的是在完成后再次调用getProgress函数

您可以通过向ajax调用添加“complete”参数来实现这一点

$.ajax({
  //this is where your stuff already is
  ,complete: getProgress()

  //we add a timeout so it doesn't run everytime it completes, only when we want to update the progress bar.
  ,timeout: 10000 //this is 10 seconds
});

这是一种通常称为“轮询”的方法。

您需要:

function StartLoop(){
    for (var i = 0; i < 100; i++) {
        setTimeout(GetProgress(), 3000*i);
    }
}
在回调中,执行以下操作:

$.ajax({
    url: "query.aspx/GetProgress",
    success: function (msg) {
        var data = $.parseJSON(msg.d);
        $("#pbrQuery").progressbar("value", data.value);

        if (data.value == 100) {
            isDone = true;
            clearInterval(myInterval);
        }          
    }
});
clearInterval
将阻止它再次调用
GetProgress()
。使用
setInterval
方法意味着您不必知道预先需要多少轮询循环。它会一直持续到你完成为止

或者更好的,您可以从ajax回调调用
GetProgress()
,其优点是只有在您收到查询响应后,它才会再次轮询:

function GetProgress() {
    $.ajax({
        url: "query.aspx/GetProgress",
        success: function (msg) {
            var data = $.parseJSON(msg.d);
            $("#pbrQuery").progressbar("value", data.value);

            if (data.value == 100) {
                isDone = true;
            } else {
                setTimeout(GetProgress(), 2000);
            }
        }
    });
}

然后只需调用一次
GetProgress()
即可启动循环。

有趣的问题。:)我想不出一个好答案。你试过使用setInterval吗?当您尝试递归方法时发生了什么?我得到了快速的请求/响应。这看起来很有希望,但不幸的是,我认为“超时”指的是它将在多长时间内删除ajax请求。我仍然收到一个快速射击请求循环。是的,你是对的。Jeff B的答案正是我将要修改的答案-因此,我正在培养他的答案。您的第二个解决方案在早些时候对我来说是有意义的,但出于某种原因,它忽略了成功函数中的setTimeout使其工作。。使用了第二个解决方案,即setInterval和clearInterval。在这里读一个很好的解释:谢谢!
$.ajax({
    url: "query.aspx/GetProgress",
    success: function (msg) {
        var data = $.parseJSON(msg.d);
        $("#pbrQuery").progressbar("value", data.value);

        if (data.value == 100) {
            isDone = true;
            clearInterval(myInterval);
        }          
    }
});
function GetProgress() {
    $.ajax({
        url: "query.aspx/GetProgress",
        success: function (msg) {
            var data = $.parseJSON(msg.d);
            $("#pbrQuery").progressbar("value", data.value);

            if (data.value == 100) {
                isDone = true;
            } else {
                setTimeout(GetProgress(), 2000);
            }
        }
    });
}