0

这是我的代码:

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'));
            }                                        
        }
    });
}

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

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

这就是发生的事情:在调用 MyMethod 之前一切都很好。当它被调用时,浏览器停止工作。如果我按下鼠标左键,什么也不会发生。当最后一次调用 MyMethod 时,浏览器工作正常,我快速浏览了该消息,然后它显示了来自第二个 ajax 调用的数据。我很快看到的消息是整个消息,来自对 MyMethod 的所有调用,这不应该发生。

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

4

1 回答 1

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);
        }
    })
}

这样他们就可以异步运行,在他们调用的时候不要阻塞一切;但仍然串联运行。

于 2013-04-03T12:24:32.037 回答