【发布时间】:2012-04-20 08:55:52
【问题描述】:
花了一些时间试图实现这一点,并有一个我认为在 Firefox 中运行良好的解决方案,但是在 IE 中测试时发现使用 async: false 会导致浏览器被锁定(停止响应并且似乎已冻结) 在通话期间。
要求基本如下。我提供了一系列用户可以检查的复选框。在特定时间,我调用我的函数“selectedSeriesData()”,该函数用于一个接一个地向我的服务发送请求,获取请求的数据。我特别选择使用同步,以便在方法执行时向浏览器输出状态消息和警告。
例如。 “加载数据 1/3”,然后“加载数据 2/3”,“加载数据 3/3”
当然,我现在知道这会锁定某些浏览器,因此在 IE 中的体验不仅会锁定浏览器,而且我尝试显示的任何消息都不会显示。是否有任何简单的 doEvents 之类的动作,我可以在每次 ajax 调用后调用,或者只是重组我的 ajax 调用的问题。如果是这样的话,根据我的要求有什么实施建议吗?
以下是代码的简化摘录,以供参考。
function selectedSeriesData() {
var seriesData = [];
var index = 0;
$.each($("input[name='idCheckBox']:checked"), function () {
var id = $(this).val();
$("#loadingMessage").text("Loading " + id + "...");
$.ajax({
type: 'POST',
async: false,
url: '<%: loadSeriesDataPath %>',
dataType: 'json',
data: {
Id: id
},
success: function (data) {
seriesData[index] = data;
index++;
},
error: function (xhr, ajaxOptions, error) {
$("#warnings ul").append('<li>A communication error occured while attempting to load data for the series.</li>');
}
});
}
});
return seriesData;
}
【问题讨论】:
-
OptimusCrime,当我说锁定时,我的意思是浏览器实际上停止响应,并且只有在循环完成执行后才开始响应。所以对于使用 IE 的最终用户来说,看起来浏览器已经崩溃了。
-
你能提供jsFiddle的例子吗?
-
为什么需要同步 XHR?!
-
您已经发现了 AJAX 调用是异步的原因。同步调用可以并且将会锁定浏览器,因为 JS 引擎会等待调用完成。为什么不使用异步调用?
-
ThiefMaster,我解释了原因,我在问我应该怎么做,因为这显然是错误的方法。
标签: jquery ajax asynchronous