最近遇到一个问题,服务器的执行效果和本地调试的效果不一致。需求是这样:上传50张图片,只要一张图片处理完,立马弹出一个框显示处理结果,其他图片处理结果异步回显。后端因为特殊原因,期待前端连续发50个请求,而不是一次发送一个请求。但是出现了个问题:
1、页面渲延迟,变得卡顿。图片上传后,有一张图片的处理结果已经返回,但是弹框迟迟不弹出,直到有40多个处理结果返回的时候,弹框才出现;
2、页面脚本执行被阻塞。弹框出现后,脚本的执行被阻塞,很多执行方法要等待40多个处理结果返回的时候,才能执行;
原来大概的代码如下:
for(var i = 0; i < 50; i++) {
uploadFile(files[i]);
}
修改代码,延迟请求发出时间,减少同一时间的并发量。
for(var i = 0; i < 50; i++) {
(function(index) {
setTimeout(function () {
uploadFile(files[index]);
}, 500 * index);
})(i);
}
并发的一些知识点:
客户端对同一个主机域名的并发连接数量是有限的,当连接数量超过限制时,会导致其余请求就会被阻塞,另外脚本下载和运行也会被阻塞。
下面是浏览器并发连接数量表:来源(http://www.stevesouders.com/blog/2008/03/20/roundup-on-parallel-connections/)