前言
产品经理: 你这下载按钮点了没反应啊!
你: 那是后台太慢了。
产品经理: 后台去优化,你给我加一个loading动画
遇到这种情况,以前我都是跟后台商量说: 这个接口返回的是文件流,我捕捉不到,所以没办法判断loading啥时候结束。需要拆成两个接口:
- 发起请求,显示loading,告诉后台该整理数据里。
- 请求回来后loading结束,同时发起另一个请求,下载数据
两个接口
就是上面说的方案。
流程
- 前端显示loading。请求接口1,传条件,告诉后台准备数据;
- 后台根据请求值开始准备数据;
- 后台准备完成后,将数据存成文件放在服务器里,并返回接口1;
- 前端接受到接口1的响应后,结束loading,同时请求接口2,下载接口1准备的文件。
 
注: 为了保证接口2下载的数据是第一次接口1所准备的,所以第3步接口1的返回值需要给一个id。请求接口2的时候把id带给后台。
结论
目测没有什么问题,是的,我之前用的时候也可以满足需求正常使用。但是有一天,后台提出,要多台服务器,做负载均衡。这问题就出现了: 接口1是A服务器接收的请求,准备的文件也放在了A服务器,但但但接口2再请求的时候不一定是A服务器,所以找不到接口1准备的文件了。
说: 只定一台服务器放准备的文件即可,我看行,但是没这样做。
一个接口
设置响应数据的类型responseType为blob
上代码
| 1 | function downloadFile(url: string, params: any, cb: any) { | 
效果如下图,一个接口