我在页面上有两个脚本标记,每个标记包含一个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>
为什么我的GetTree
页面方法仅在GetTop50
的成功回调之后继续执行?我将断点设置为GetTree方法服务器端,并且仅在加载选择列表后才会触发。
答案 0 :(得分:5)
客户端将一个接一个地启动两个ajax调用,以便它们都是&#34;在飞行中&#34;同时。然后由服务器决定首先完成服务器并依赖于服务器的配置方式(它将一次处理多个请求),并取决于每个请求的作用。
如果您的服务器一次只处理一个请求,或者它在一些共享资源(例如数据库)上阻塞,那么它可能会在返回第二个请求结果之前返回它收到的第一个请求 - 尽管这只是一个可能的选择,当然不是一个保证的选择。例如,如果第一个请求的处理时间总是比第二个请求要长,并且它们都不会竞争相同的共享资源,那么第二个请求可能会先完成并首先返回其结果。
请求也可能以随机顺序返回,有时一个将首先返回,有时另一个将首先返回。正如我之前所说,这完全取决于服务器如何处理每个请求以及它首先完成哪一个。
另外,请记住,客户端JS是单线程的,所以当你在某个地方坐在客户端的JS断点时,其他JS在当前的执行JS线程完成之前无法运行。至于服务器端断点的行为,这一切都取决于服务器执行环境是什么以及它在断点期间的工作方式。
如果要调试与时序相关的事情,断点不是测试事物的可靠方法,因为点击断点本身很容易影响行为。相反,您应该使用具有准确时间戳的日志记录来研究事件的确切顺序。
答案 1 :(得分:1)
我想感谢所有人的投入,尤其是@jfriend00,并为我的问题发布了确切的解决方案。
所以问题是Default.aspx访问Session,并且有EnableSessionState="True"
页面指令。
设置此指令后,将在服务器端对请求进行顺序化。
我通过将我的方法移动到另一个不使用会话状态的页面来解决它。