几天前,我问了这个问题:
我几乎在同一控制器动作上同时触发了六个jQuery ajax异步ajax请求。每个请求需要10秒才能返回。
通过调试和记录对操作方法的请求,我注意到请求已被序列化,并且从未并行运行。即我在log4net日志中看到一个时间轴,如下所示:
2010-12-13 13:25:06,633 [11164]信息-获得:1156 2010-12-13 13:25:16,634 [11164]信息-返回:1156 2010-12-13 13:25:16,770 [7124]信息-得到:1426 2010-12-13 13:25:26,772 [7124]信息-返回:1426 2010-12-13 13:25:26,925 [11164]信息-得到:1912 2010-12-13 13:25:36,926 [11164]信息-返回:1912 2010-12-13 13:25:37,096 [9812]信息-得到:1913 2010-12-13 13:25:47,098 [9812]信息-返回:1913 2010-12-13 13:25:47,283 [7124] INFO-Got:2002 2010-12-13 13:25:57,285 [7124]信息-返回:2002 2010-12-13 13:25:57,424 [11164]信息-获得:1308 2010-12-13 13:26:07,425 [11164]信息-返回:1308
查看FireFox中的网络时间轴,我看到以下内容:
上面的日志示例和Firefox网络时间轴都针对同一组请求。
是否对来自同一页面的同一操作的请求进行了序列化?我知道Session
在同一会话中对对象的序列化访问,但是没有任何会话数据被触摸。
我将客户端代码剥离为一个请求(运行时间最长的请求),但这仍然会阻塞浏览器,即,仅当ajax请求完成时,浏览器才会响应任何链接单击。
我在这里(在Chrome的开发人员工具中)还观察到,在长时间运行的ajax请求执行时单击链接时,它Failed to load resource
立即报告一个错误,表明浏览器已杀死(或试图杀死并等待它?)请求:
但是,浏览器仍然需要一段时间才能重定向到新页面。
Ajax请求真的是异步的吗?还是因为JavaScript实际上是单线程的,所以这是个小技巧吗?
我的请求是否花了太长时间才能完成?
Firefox和IE中也会发生此问题。
我还更改了脚本以$.ajax
直接和显式使用set async: true
。
我在IIS7.5上运行此代码,Windows 2008R2和Windows 7版本都执行相同的操作。
调试和发布版本的行为也相同。