为什么这些$ .getJSON调用并行返回?

时间:2013-02-12 12:57:42

标签: jquery asp.net json

<script type="text/javascript">
    var sourceData = {sites:[{ name: "London" , Id: "0"}, { name: "Bath", Id: "1"}, { name: "Cambridge", Id: "2"}]};
    $(document).ready(function () {
    $(sourceData.sites).each(function (index, data) { var objName = "<div class='bold' id = place" + data.Id + ">" + data.name + "</div>"; $('#results').append(objName); });

    $(sourceData.sites).each(function (index, data) {
    $.getJSON("GenerateData.aspx?place=" + data.name, function (retData) {
            $('#place' + data.Id)
                .wrap("<a href=GenerateData.aspx?place=" + data.name + "></a>")
                .append(retData.Wait); });
        });
    });
</script>

所以基本上generateData只返回一个看起来像的json:

{"name": "(place parameter passed back)", "Wait": 5000}

除了5000实际上是Rand(0,5000)并且还对应于在返回请求之前执行的thread.sleep。

我无法理解的是,当我得到一些并行化(返回结果的顺序是随机的)时,它们返回的顺序不是从最低到最高,而且总返回时间是等于总等待时间。

因此,即使请求似乎是并行发送的,也没有针对GenerateData的请求的实际并行化。

我见过Asynchronous Controller is blocking requests in ASP.NET MVC through jQuery,但这似乎与我尚未使用的MVC有关。

我是从jquery方面做错了什么,或者这是另一个ASP.net会话弄乱并行化的情况?

look at the latencies in the javascript console

1 个答案:

答案 0 :(得分:1)

$.getJSON()是异步操作并非巧合。请求响应不会按照请求的相同方式进行排序,或者至少很少会被排序。如果您希望您的请求按照发送的顺序返回,那么您需要创建一个Ajax队列,然后在完成先前的请求后发送请求。您可以使用jQuery.queue()实现此目的。