两个异步$ .ajax调用之间的竞争条件:Chrome不受影响?

时间:2014-11-17 11:12:13

标签: jquery ajax google-chrome internet-explorer firefox

我有一个有趣的竞争条件,以下代码仅适用于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错误吗?这不是可以在其他情况下产生问题的东西(例如,如果希望函数在不同对象上以并行方式工作)吗?

谢谢!

1 个答案:

答案 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个图像,结果会有所不同。

无论如何总结一下,你不能依赖异步请求的响应顺序。