Progress Bar
首先,目前几乎大多数网页上的Progress bar都是假的,在浏览器与服务器端交互过程中由于浏览器端的Ajax支持的特性受限没有办法知道已加载了多少内容,并且还有一种是Content-Length不声明的。所简单来说Progress bar不太能绘出实际网络情况,它跟Upload还不一样,Upload是已经知道文件的大小,它只要拿到服务器端返回的已上传大小数据就能绘制出Progress bar。
Angular的一个插件效果
我最近也在项目里加了一个Progress bar,代码不太美观,这里就不贴了,说一说这中间遇到一些需要思考的问题。
如何设计
分三段:
- 0% - 30% 起步期间
- 30% - 90% 等待响应期间
- 90% - 100% 响应后,结束显示
发起一个Ajax请求后,Progress bar就会先走第一步,如果这期间服务器端没有响应,那么就会以1%-5%随机走第二步,如果这期间服务器没有响应就在90%地方静止不动,直到服务器端响应后在走完
如果有多个请求同时存在,这是最不好处理的地方了,一种处理是不允许同时存在多个请求?但可能体验不太好。既然不能避免同时存在多个请求,那么就要考虑如何处理同时发起多个Ajax请求之后,Progress bar如何处理。我的处理方法是把每一个Progress bar周期内的Ajax请求都加入队列,在这个队列都结束后才能让Progress bar结束,因为一个页面上就只有一个Progress bar,不能每一个Ajax请求都有对应的控制代码,否则就会出现回退,忽然多忽然少,闪烁的情况。
终止请求
请求是可以abort的,比如在发现一段时间后服务器还没有响应,而你的进度条却一直悬挂在页面顶部,这会用户会误以为你的页面正在工作而不敢做其它操作。所以对于每一个请求都要加入timeout机制,在超时终止请求后让Progress bar回退,就类似于我们在安装桌面软件时可能中途出错,于是安装进度条就会回退