暂停执行直到ajax请求完成

时间:2014-10-03 10:07:18

标签: jquery ajax

有没有办法在等待请求完成时暂停jquery执行,以便您可以跟踪其进度?这是我的代码:

    $("span").click(function() {
        istrainning= true;
        for (var i=0;i<1000;i++)
            $.post("train.php",function(){
                $(".progressbar").width((i/10)+"%");
                $("label").html((i/10)+"%");
            });
    });

我想要陈述

$(".progressbar").width((i/10)+"%");
$("label").html((i/10)+"%");

仅在完成发布请求后执行。请帮忙。

- 编辑:

对不起。似乎我的错误是1000个请求同时完成。有没有办法做到这一点,所有请求将一次完成一个?

3 个答案:

答案 0 :(得分:0)

他们已经在成功回调中,所以他们已经在POST完成后执行。

我相信你的问题是第一个ajax完成时循环已经完成,因此i将永远是1000

查看http://fixingthesejquery.com/#slide55

我不认为发布1000个HTTP请求是一个特别好的主意,但为了避免i范围问题,您可以使用闭包:

$("span").click(function() {
    istrainning= true;
    for (var i=0;i<1000;i++) {
        $.post("train.php",(function(i){
            return function() {
                $(".progressbar").width((i/10)+"%");
                $("label").html((i/10)+"%");
            }
        })(i)); // supply i as a parameter to the IIFE
    }
});

进一步阅读

答案 1 :(得分:0)

您可以将.done(function(){....})附加到代码中,以便在成功完成后运行。如果成功与否,.always()将会运行。

jQuery.post( ) .done( ) and success:

答案 2 :(得分:0)

问题是在循环中错误地使用了闭包变量。

$("span").click(function () {
    istrainning = true;
    var counter = 0,
        handler = function () {
            counter++;
            $(".progressbar").width((counter / 10) + "%");
            $("label").html((counter / 10) + "%");
        }
    for (var i = 0; i < 1000; i++) {
        $.post("/echo/html/", {
            html: '<b>' + i + '</b>'
        }, handler);
    }
});

演示:Fiddle - 模拟只有5个循环

注意:发送1000个ajax请求绝不是一个好设计,希望它只是为了测试一些东西