在for循环中同步ajax调用后,浏览器停止工作一段时间

时间:2013-04-03 12:00:34

标签: jquery ajax browser

这是我的代码:

for (var i = 0; i < 2; i++) {
    $.ajax({
        type: "GET",
        async: false,
        url: "/MyController/MyMethod",
        success: function (data) {
            if (i == 0) {
                $('#result_progress').hide();
                $('#result_msg').hide();
                $('#details').show();
            } else if (i == 1) {
                $.ajax({
                type: "GET",
                async: true,
                url: "/Import/Finish",
                success: function (data) {
                        ....                        
                });                                            
            }
            if (i < 2) {
                $('#details').html($('#details').html() + 'someText'));
            }                                        
        }
    });
}

在这个例子中,迭代很小,但我在这里使方法更简单。我知道我可以使用开关,但这不是重点。实际上它有更多的循环。没关系,这个代码也会发生错误。

以下是发生的事情: 如果我把断点放在第一个ajax调用的成功部分和我在Chrome中调试时,eveything工作正常。 这就是我工作正常的意思:在第一次成功之后,我希望隐藏一些div,并显示我从ajax调用中得到的消息。第二次输入第一次成功时,另一个字符串将添加到前一个字符串。 最后,当输入第二个成功部分时,该信息被隐藏,我正在显示一些数据。

这就是发生的事情: 一切都很好,直到调用MyMethod。当它被调用时,浏览器停止工作。如果我按下鼠标左键,则没有任何反应。当最后一次调用MyMethod时,浏览器工作正常,我快速看到消息,然后显示第二次ajax调用的数据。我很快就看到的消息是从MyMethod的所有调用中发出的全部信息,这不应该发生。

我希望在整个for循环和Finish方法之前显示它。它不应该是相同的信息。每次调用MyMethod时都会变大。

1 个答案:

答案 0 :(得分:2)

您可以使用“递归”功能来帮助您使用异步调用来控制流。您可以异步运行它们,而不是同步运行它们,然后在下一个时间再次调用该函数。

类似的东西:

function doCall(i) {
    if(i > howManyToRun) return;

    $.ajax({
        //...
        succcess: function(data) {
            //...
            //time to start the next one
            doCall(++i);
        },
        error: function() {
            //call the next one on error?
            doCallI(++i);
        }
    })
}

这样他们就可以运行异步,不要在他们打电话时阻止所有内容;但仍然是串联的。