1、页面会出现‘假死’
setTimeout
在等到每次EventLoop时,都要判断是否到指定时间,直到时间到再执行函数,一旦遇到页面有大量任务或者返回时间特别耗时,页面就会出现‘假死’,无法响应用户行为。
2、
无谓的网络传输
当客户端按固定频率向服务器发起请求,数据可能并没有更新,浪费服务器资源。
iframe
流方式是在页面中插入一个隐藏的iframe,利用其src属性在服务器和客户端之间创建一条长连接,服务器向iframe传输数据(通常是HTML,内有负责插入信息的
javascript
),来实时更新页面。
SSE
本质是发送的不是一次性的数据包,而是一个数据流。可以使用
HTTP 301
和 307 重定向与正常的 HTTP 请求一样。服务端连续不断的发送,客户端不会关闭连接,如果连接断开,浏览器会尝试重新连接。如果连接被关闭,客户端可以被告知使用
HTTP 204
无内容响应代码停止重新连接。
sse
只适用于高级浏览器,ie不支持。因为ie上的XMLHttpRequest对象不支持获取部分的响应内容,只有在响应完成之后才能获取其内容。
1
、怎么确定推过来的消息是新消息
这里我们设置了一个本地缓存,用来存放上一次从redis中获取的信息,和当前从redis获取的信息做对比,不同,则认为是新信息返回给客户端并标识是新数据。
2
、刷新页面原先推送过来的消息消失了
因为在通过redis和本地缓存对比的时候没有区别所以不会推送,这里前端设置一个随机数num,在存入本地缓存时key值多加了num的区分。
3
、解决容器超时的问题
后端容器的单个连接超时时间为2分钟,后端每隔3秒钟会轮询一次redis,到第20次的时候,会推送个带有个标识的数据。
4
、接口防刷方案
后端记录每次获取到的num值判断总数vnum,超过一定数量返回http 204断开连接。