当前位置: 首页 > news >正文

对轮询的理解

✨✨✨目录

一、什么是轮询

1.短轮询(Short Polling)

2.长轮询(Long Polling)

二、前端轮询的实现方式

1.基于定时器的轮询使用 setInterval() 方法来定时发送请求

2.基于递归的轮询则使用 setTimeout() 方法来控制下一次请求的时间

3.两种比较

三、轮询的优缺点

1.优点

2.缺点

四、轮询与WebSocket/SSE的比较


在Web开发中,实时获取服务器数据是一个常见需求。WebSocket和Server-Sent Events(SSE)等现代技术提供了更高效的实时通信方案,但轮询(Polling)作为一种简单可靠的技术,仍然在许多场景下有着广泛应用。

一、什么是轮询

轮询是指在一定的时间间隔内,定时向服务器发送请求,获取最新数据的过程。轮询通常用于从服务器获取实时更新的数据。

轮询主要有两种形式:

1.短轮询(Short Polling)

客户端在固定的时间间隔内向服务器发送请求,即使服务器没有数据更新也会继续发送请求。

2.长轮询(Long Polling)

客户端发送请求后,服务器保持连接打开,如果没有数据更新,则不会立即返回,而是将请求挂起,直到有数据更新时再返回结果。

二、前端轮询的实现方式

前端轮询的实现方式有两种:基于定时器的轮询和基于递归的轮询。

1.基于定时器的轮询使用 setInterval() 方法来定时发送请求

使用 setInterval() 方法设置一个固定间隔的定时器,每隔指定时间就执行一次数据请求。这种方式简单直接,但缺点是无论上一次请求是否完成,都会按时发起下一次请求。

  • 固定间隔执行,不考虑前一次请求是否完成
  • 实现简单直观
  • 可能导致请求堆积(如果服务器响应慢)
// 大概的setInterval轮询,仅供参考
function startIntervalPolling(url, interval = 3000) {const timer = setInterval(async () => {try {const response = await fetch(url);const data = await response.json();console.log('收到数据:', data);} catch (error) {console.error('请求失败:', error);}}, interval);// 返回停止轮询的函数return () => clearInterval(timer);
}// 使用示例
const stopPolling = startIntervalPolling('接口地址');// 停止轮询(需要时调用)
// stopPolling();

2.基于递归的轮询则使用 setTimeout() 方法来控制下一次请求的时间

使用 setTimeout() 递归调用请求函数,每次请求完成后才设置下一次请求的定时器。这种方式可以确保前一次请求完成后再发起下一次请求,避免请求堆积。

  • 请求之间有明确的顺序关系
  • 前一次请求完成后才安排下一次请求
  • 不会出现请求堆积的情况
  • 可以更灵活地根据响应情况调整间隔
// 大概的setTimeout递归轮询,仅供参考
function startRecursivePolling(url, interval = 3000) {let isPolling = true;async function poll() {if (!isPolling) return;try {const response = await fetch(url);const data = await response.json();console.log('收到数据:', data);} catch (error) {console.error('请求失败:', error);} finally {// 确保前一次完成后,再设置下一次轮询if (isPolling) {setTimeout(poll, interval);}}}poll(); // 立即启动第一次请求// 返回停止轮询的函数return () => { isPolling = false; };
}// 使用示例
const stopPolling = startRecursivePolling('接口地址');// 停止轮询(需要时调用)
// stopPolling();

3.两种比较

特性setInterval 轮询setTimeout 递归轮询
实现方式固定间隔定时器递归调用 + 延迟执行
请求顺序并行请求(可能重叠)严格顺序执行
请求堆积风险高(服务器响应慢时)
错误处理需额外处理可在 finally 中统一处理
动态调整间隔困难容易
代码复杂度简单稍复杂

三、轮询的优缺点

1.优点

简单易实现:不需要特殊服务器支持(短轮询)

广泛兼容性:几乎所有浏览器和服务器都支持

可控性:可以轻松调整轮询频率

适合低频更新:对于不频繁更新的数据足够高效

2.缺点

效率问题:短轮询会产生大量不必要的请求

延迟:短轮询有固定的延迟,长轮询有超时延迟

服务器负载:大量轮询请求可能增加服务器负担

无状态:每次请求都是独立的,难以维护会话状态

四、轮询与WebSocket/SSE的比较

特性轮询WebSocketSSE
连接方式HTTP请求持久双向连接持久单向连接
实时性中等(取决于轮询间隔)
服务器负载高(尤其短轮询)中等
浏览器支持所有浏览器现代浏览器现代浏览器
数据格式任意(通常JSON)任意(通常JSON)纯文本(可包含事件ID)
双向通信需要两个端点原生支持仅服务器到客户端

需要真正实时性的应用,建议考虑WebSocket或SSE。但对于简单的需求,轮询更适用。短轮询适合数据更新不频繁或对实时性要求不高的场景,而长轮询则提供了更好的实时性。

若文章对你有帮助,点赞❤️、收藏⭐加关注➕吧!

http://www.dtcms.com/a/365312.html

相关文章:

  • 手持式气象观测仪在短期监测项目的作用
  • 深度学习之第六课卷积神经网络 (CNN)如何保存和使用最优模型
  • GOFLY开源客服系统-处理gin框架下的session中间件
  • 【线段树 懒删除堆】P12372 [蓝桥杯 2022 省 Python B] 最优清零方案|普及+
  • 【Python接口自动化】调用飞书机器人
  • TLSF内存算法适配HTOS
  • React实现列表拖拽排序
  • PyTorch实战(6)——模型微调详解
  • 落地页测试case(Android视角)
  • Redis突然挂了,数据丢了多少?就看你用RDB还是AOF
  • SecureCRT v9.5.2 Mac SSH终端操作工具
  • C++从入门到实战(二十一)List迭代器实现
  • 行业分享丨基于SimSolid的大型汽车连续冲压模具刚度分析
  • 【Axure高保真原型】区间缩放柱状图
  • JavaScript箭头函数与普通函数:两种工作方式的深度解析
  • android studio打开Android Device Monitor
  • Java 鲁棒性:支撑企业级应用稳定运行的核心密码
  • websoket使用记录
  • 马斯克砸钱造AI,却败给最low的“让离职员工轻松拷走代码”
  • OpenLayers 入门篇教程 -- 章节三 :掌控地图的视野和交互
  • 《计算机网络安全》实验报告一 现代网络安全挑战 拒绝服务与分布式拒绝服务攻击的演变与防御策略(1)
  • 【全息投影】幻影成像技术在展厅中的创新应用
  • 求单源最短路(Dijkstra 算法-迪杰斯特拉算法,SPFA)
  • word文档封面中文件编号等标题和内容无法对齐
  • 关于QSharedPointer
  • 清理磁盘:卸载 GitLab CI/CD Multi-Runner 删除docker相关文件
  • linux服务开机自启动之二(forking方式)
  • undo-log
  • 用 “走楼梯” 讲透动态规划!4 个前端场景 + 4 道 LeetCode 题手把手教
  • MySQL的utf8 、utf8mb3 和 utf8mb4 的区别和排序规则