日期:2014-05-16  浏览次数:20636 次

Ajax导致后续的程序被卡死,除非取消Ajax请求或者完成,这是什么原因?语言是ASP
页面A:列表页,列表页上有个额外的DIV是放置Ajax返回结果的。这个Ajax请求是在页面载入完毕之后,在服务器端创建一个Msxml2.ServerXMLHTTP对象,向另外一个API提供商请求返回一个XML文档。返回成功之后,ASP程序负责在服务器端把这个XML内容提取出来,放在一个HTML里面,然后又最开始的那个Ajax填充到这个DIV里面去。

过程可能有点绕,简单说:
a.html加载完成--->JS(Jquery).Ajax请求Ajax_a.asp页面--->Ajax_a.asp页面是个纯程序,创建服务器端Msxml2.ServerXMLHTTP对象请求API内容--->API返回XML--->Ajax_a.asp分析XML并填充数据--->Ajax_a.asp响应一段html代码--->Jqeury.ajax获取到html--->$('#div').html(data);

客户端和服务器端两个异步操作。

但是因为API那边和我们服务器之间的通讯受网络环境影响,有时候会超时,有时候响应时间很长,在等待响应的时候,如果点击页面A上的链接打开新窗口<target="_blank">进入到页面B.asp,那么B.asp页面也不执行,必须等A.html发起的Ajax完全结束(要么成功,要么超时,要么取消)时,B.asp的代码才会运行。

这个原因在哪呢?我把target="_blank"去掉,在当前窗口跳转到页面B.asp,FireBUG会显示之前的Ajax被取消——这个很容易理解。问题是现在需求不允许去掉target="_blank"....

------解决方案--------------------
应该是服务器端的xhr请求阻止了其他发送到服务器端的请求,并不是客户端的xhr请求导致的。

之前碰到过,也是用服务器端xhr抓别人的信息更新数据库,执行大概10多s才完成,客户端xhr请求这个页面后,点击其他链接打开的页面都是空白的,一直loading直到客户端xhr完成

你可以将服务器端xhr设置为异步的试试,我是没试过。。