Javascript 为什么对两个页面方法的ajax调用是同步执行的?

Javascript 为什么对两个页面方法的ajax调用是同步执行的?,javascript,jquery,ajax,Javascript,Jquery,Ajax,我在页面上有两个脚本标记,每个标记都包含一个document.ready(),每个标记都在对页面方法进行ajax调用 第一个将值加载到选择列表中。第二个将树加载到DOM中 <script> $(document).ready(function() { $.ajax({ url: 'PageMethods.aspx/GetTop50', async: true, success: function(data) {

我在页面上有两个脚本标记,每个标记都包含一个document.ready(),每个标记都在对页面方法进行ajax调用

第一个将值加载到选择列表中。第二个将树加载到DOM中

<script>
  $(document).ready(function() {
     $.ajax({
         url: 'PageMethods.aspx/GetTop50',
         async: true,
         success: function(data) {
           //loads the values to the select list 
         }
         //rest of stuff...
     });
  })
</script>

<script>
  $(document).ready(function() {
     $.ajax({
         url: 'Default.aspx/GetTree',
         async: true,
         success: function(data) {
         // loads the tree into DOM
         }
         //rest of stuff...
     });
  })
</script>

$(文档).ready(函数(){
$.ajax({
url:'PageMethods.aspx/GetTop50',
async:true,
成功:功能(数据){
//将值加载到“选择”列表中
}
//其他的东西。。。
});
})
$(文档).ready(函数(){
$.ajax({
url:'Default.aspx/GetTree',
async:true,
成功:功能(数据){
//将树加载到DOM中
}
//其他的东西。。。
});
})

为什么我的
GetTree
page方法只有在
GetTop50
成功回调之后才继续执行?我将断点设置为GetTree method serverside,只有在加载选择列表后才会命中它。

客户端将依次启动两个ajax调用,以便它们同时处于“运行中”。然后由服务器决定首先完成哪个任务,这取决于服务器的配置方式(它将一次处理多个请求)以及每个请求的执行情况

如果您的服务器一次只处理一个请求,或者如果它阻塞了某个共享资源(如数据库),那么它很可能会在返回第二个请求结果之前返回它收到的第一个请求-尽管这只是一个可能的选项,当然不是一个保证选项。例如,如果第一个请求的处理时间几乎总是比第二个请求长,并且两个请求都没有争夺同一个共享资源,那么第二个请求可能会首先完成并返回其结果

请求也有可能以随机顺序返回,有时一个先返回,有时另一个先返回。如前所述,这完全取决于服务器如何处理每个请求以及它首先完成哪个请求


另外,请记住,客户端JS是单线程的,因此当您位于某个客户端JS断点处时,在当前JS执行线程完成之前,其他JS无法运行。至于服务器端断点中的行为,这完全取决于服务器执行环境是什么以及它在断点期间如何工作



如果您想调试与时间相关的东西,那么断点并不是测试东西的可靠方法,因为命中断点本身很容易影响行为。相反,您应该使用带有准确时间戳的日志记录来研究事件的确切顺序。

客户端将一个接一个地启动两个ajax调用,以便它们同时处于“运行中”。然后由服务器决定首先完成哪个任务,这取决于服务器的配置方式(它将一次处理多个请求)以及每个请求的执行情况

如果您的服务器一次只处理一个请求,或者如果它阻塞了某个共享资源(如数据库),那么它很可能会在返回第二个请求结果之前返回它收到的第一个请求-尽管这只是一个可能的选项,当然不是一个保证选项。例如,如果第一个请求的处理时间几乎总是比第二个请求长,并且两个请求都没有争夺同一个共享资源,那么第二个请求可能会首先完成并返回其结果

请求也有可能以随机顺序返回,有时一个先返回,有时另一个先返回。如前所述,这完全取决于服务器如何处理每个请求以及它首先完成哪个请求


另外,请记住,客户端JS是单线程的,因此当您位于某个客户端JS断点处时,在当前JS执行线程完成之前,其他JS无法运行。至于服务器端断点中的行为,这完全取决于服务器执行环境是什么以及它在断点期间如何工作



如果您想调试与时间相关的东西,那么断点并不是测试东西的可靠方法,因为命中断点本身很容易影响行为。相反,您应该使用带有准确时间戳的日志记录来研究事件的确切顺序。

我要感谢大家的投入,特别是@jfriend00,并发布我问题的确切解决方案

因此,问题在于Default.aspx访问会话,并具有
EnableSessionState=“True”
page指令

设置此指令时,请求在服务器端按顺序排列


我通过将我的方法移动到另一个不使用会话状态的页面来解决这个问题。

我要感谢大家的投入,特别是@jfriend00,并发布我问题的确切解决方案

因此,问题在于Default.aspx访问会话,并具有
EnableSessionState=“True”
page指令

设置此指令时,请求在服务器端按顺序排列


我通过将我的方法移动到另一个不使用会话状态的页面来解决这个问题。

假设上面的内容只是一个输入错误(为什么要重新输入?复制并粘贴!),那么上面的代码中没有任何内容可以序列化请求,所以问题出在其他地方——可能是服务器将第二个请求排队,特别是在调试模式下。您所说的是“服务器端断点”。当你在客户端谈论顺序性时,你到底是什么意思?为什么?因为纯粹的运气。请求可以按任意顺序到达您的服务器(客户端的响应也是如此)。@T.J.Crowder好的,我没有太注意语法。我想这可能是JS中我不懂的地方。@hon2a我只是期待着两个突破