2013-02-12 72 views
0
<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实际上是兰特(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

+0

肯定听起来像会话。 – Jon 2013-02-12 13:00:58

+0

它们不是并行发送,而是按顺序发送。 $ .getJSON是异步的,所以它不会阻塞,直到它收到一个回复​​,但这不同于并行,并且会影响它们在服务器端处理的顺序。 – 2013-02-12 13:06:15

回答

1

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

+0

不真正回答被问到的问题:'为什么我的请求会按顺序显示,而不是平行?'。 – Mr47 2013-02-12 13:10:18

+1

@ Mr47“为什么这些$ .getJSON调用不会并行返回?”这个问题指出这一点。它们是并行发送的,因为您正在循环发送请求。 – 2013-02-12 13:12:55

+0

它们不是并行发送,而是按顺序发送(异步) – 2013-02-12 13:20:14