前端发送异步请求后,后端处理时间长,前端在后端处理完成后才能在页面上显示处理完成,有什么比较好的方法吗?

场景:
1、前端发送处理请求后,后端开始处理
2、后端处理时间较长,估计有2、3分钟(时间每次都不太确定)才能处理完
3、后端处理完后,前端在页面上显示处理完成
现在想到的办法:
在发送处理请求后,用setInterval每隔10s发送一次,询问是否完成
但是总觉得这种方法会浪费带宽?
大神们,请问还有别的方法吗???### 问题描述

阅读 17.1k
6 个回答

这类问题其实本质问题是:后端如何给前端主动推送消息?
答案是:只使用http无法推送。
就只能要么定时发送请求,要么建立websocket链接
定时发送请求问服务端,是否处理完成
建立websocket,这样服务端也就可以主动给客户端推送消息了。但是事实上,因为各方面网络环境的原因,websocket的连接可能会断开。造成断开的原因很多(比如手机的客户端,信号不好;比如突然断网;比如服务器波动;比如服务器可能带宽一时不足等等),都有可能断开
所以用websocket也必须进行一个较长时间的定时发送http请求以避免断开的情况。
所以还是定时发送http请求最好。
当然可以做一些优化,比如最少需要2分钟才能完成,那么询问的http请求可以在2分钟之后再发送。

这类后台无法立即处理的请求,可以用定时查询或者websocket,总的分为2步。
1、前端发起请求,后台响应,前端界面需要有提交成功正在处理的提示。
2、后台处理完毕,向前端发送消息,前端界面显示操作完成的提示。

要么轮询,要么 WebSocket ,流行这两种做法。

用不了多少带宽,比如轮询,把 http header 精简一下,整个响应甚至只需要不到200字节。

polling 就行,专门针对这个再整一套 socket 其实没必要,另外不要一听 polling 就觉的很 low 或者浪费带宽什么的,精简一下请求的头部并没有你想像中的那么糟糕啦。

不急着看结果:定时器
急着看结果:socket

问题理解错了,Sorry

ES6中提供了原生的Promise对象

在构造Promise的时候把请求API的方法传进去,然后.then()中的方法就是请求成功后需要做的操作(例如用js操作DOM,来更新页面数据之类)

MDN-Promise文档

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题