✨✨✨目录

一、什么是轮询

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的比较

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

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

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

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐