我有一个有趣的竞争条件,以下代码仅适用于Internet Explorer 7-11,而不适用于Chrome 38。
我已经修复了问题,但我想了解更多有关不同浏览器行为的信息。
这是事件处理程序:
$("#myitem").change( function(){
/* do stuff */
data_select_form(111);
data_select_form(222);
/* do stuff */
});
这是被调用的函数:
function data_select_form(id) {
/* do stuff */
$.ajax({
type: "POST",
url: "/ajax/",
data: "p=" + id,
success: function() {
if(id==111)
{
$('#aPageElement').text("You should see this until the second call completes");
}
else
{
$('#aPageElement').text("Second call complete");
}
}
});
}
当我的/ ajax / page返回第二个调用的数据之前返回第一个(异步,第一个赢得&#39; t阻塞第二个)时,竞争条件发生。< / p>
代码本身很容易修复(只需在第一个$ .ajax()。done()上调用第二个),但令我感到困惑的是,不同浏览器的行为方式不同原始代码。 Internet Explorer尊重异步方面,并且在第一次调用缓慢时,会导致结果混乱。 Chrome只是等待第一次完成电话,这让我感到疯狂! 更新:Firefox 33的行为类似于Internet Explorer(它也不会等待第一次完成调用)。 为什么Chrome会像这样?这是一个我应该报告的Blink错误吗?这不是可以在其他情况下产生问题的东西(例如,如果希望函数在不同对象上以并行方式工作)吗? 谢谢!
答案 0 :(得分:0)
这些电话是异步的,因此您无法保证它们会返回什么样的订单。不同的浏览器会使用它来以不同的方式进行优化。
例如,Firefox允许您更改network.http.max-persistent-connections-per-server
中的pref(about:config
),例如,每个域限制1个连接,这将确保您描述的顺序,默认情况下为6
现在让我们说你的html页面上有4个大图像,在你的例子中运行javascript代码,第一个连接将由html文档使用,4个将被图像使用,&# 39; s 5所以你的javascript会留下1个连接,这将导致你描述的顺序,如果你从文档中删除了1个图像,结果会有所不同。
无论如何总结一下,你不能依赖异步请求的响应顺序。