几天前我问了这个问题:
我在同一个控制器操作中几乎同时发出6个 jQuery 异步 ajax 请求。每个请求需要10秒钟返回。
通过对操作方法的调试和日志记录请求,我注意到请求是序列化的,从不并行运行。也就是说,我在 log4net 日志中看到的时间线是这样的:
2010-12-13 13:25:06,633 [11164] INFO - Got:1156 2010-12-13 13:25:16,634 [11164] INFO - Returning:1156 2010-12-13 13:25:16,770 [7124] INFO - Got:1426 2010-12-13 13:25:26,772 [7124] INFO - Returning:1426 2010-12-13 13:25:26,925 [11164] INFO - Got:1912 2010-12-13 13:25:36,926 [11164] INFO - Returning:1912 2010-12-13 13:25:37,096 [9812] INFO - Got:1913 2010-12-13 13:25:47,098 [9812] INFO - Returning:1913 2010-12-13 13:25:47,283 [7124] INFO - Got:2002 2010-12-13 13:25:57,285 [7124] INFO - Returning:2002 2010-12-13 13:25:57,424 [11164] INFO - Got:1308 2010-12-13 13:26:07,425 [11164] INFO - Returning:1308
看看 FireFox 中的网络时间线,我发现:
上面的日志示例和 Firefox 网络时间线针对的是同一组请求。
是否对来自同一页面的相同操作的请求进行了序列化?我知道在同一个会话中对 Session
对象的序列化访问,但是没有会话数据被触及。
我将客户端代码分解为一个请求(运行时间最长的请求) ,但这仍然会阻塞浏览器,也就是说,只有当 ajax 请求完成时,浏览器才会响应任何链接点击。
我还注意到(在 Chrome 的开发工具中) ,当一个长时间运行的 ajax 请求正在执行时,点击一个链接,它会立即报告一个 Failed to load resource
错误,这表明浏览器已经关闭(或者正试图关闭并等待?)Ajax 请求:
但是浏览器重定向到新页面仍然需要一段时间。
Ajax 请求真的是异步的吗? 还是因为 javascript 实际上是单线程的?
我的请求是不是花了太长时间才起作用?
这个问题在 Firefox 和 IE 中也会出现。
我还修改了脚本,直接使用 $.ajax
并显式地设置 async: true
。
我在 IIS7.5上运行这个程序,Windows 2008R2和 Windows 7的风格做同样的事情。
调试版本和发布版本的行为也是相同的。