轮询(Polling)
从前文中可知,轮询底层是基于HTTP协议的。每次请求一次接口都需要重新构建一个http实例,导致前端性能损耗非常大。在请求间隔较短时,例如1秒请求10次接口,在运行半分钟左右可能会导致页面崩溃。
而且如果前端使用了底层为虚拟DOM的框架,例如Vue,底层需要通过diff算法比较新旧DOM进行patch,需要考虑接口请求的性能损耗能在多大的程度上影响patch逻辑的执行。
在开发中,通过自测发现使用setInterval轮询接口,并且使用v-for遍历渲染DOM时,即使为列表中每个item绑定唯一key,在接口请求速度快于虚拟DOM更新速度时会导致页面假死,并偶发页面崩溃问题。最重要的原因是单线程的JS在执行过程中,接口请求逻辑会阻塞渲染主线程。
总结可知,前端定时轮询接口的方案存在以下缺点:
- 前端页面存在性能问题
- 在请求速度足够快的情况下,偶发页面崩溃问题
- 后端服务器CPU占用率飙升,并且多个前端页面同时开时,可能会导致服务器宕机
那么,它存在这么多缺点,为什么还要使用呢?最重要的原因是对前后端现有代码侵入小,而且后端逻辑没有任何改动,只需要定制前端逻辑即可。
为了减少它的缺点带来的影响,经过探索,可以通过使用web worker技术减少接口请求对页面渲染的影响,但是如果需求中对时间精确度有要求,那么web worker技术可能不适用。

