这是我的代码:
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时都会变大。
答案 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);
}
})
}
这样他们就可以运行异步,不要在他们打电话时阻止所有内容;但仍然是串联的。