当前位置:首页 > JavaScript

js 轮询实现

2026-04-07 01:41:12JavaScript

轮询的基本概念

轮询(Polling)是一种客户端定期向服务器发送请求以获取最新数据的机制。适用于实时性要求不高的场景,如检查状态更新、数据同步等。

简单定时轮询

通过 setInterval 定时发送请求,代码示例:

js 轮询实现

function pollServer() {
  fetch('https://api.example.com/data')
    .then(response => response.json())
    .then(data => console.log('更新数据:', data))
    .catch(error => console.error('请求失败:', error));
}

// 每5秒轮询一次
const pollInterval = setInterval(pollServer, 5000);

// 停止轮询
// clearInterval(pollInterval);

带退避策略的轮询

当服务器压力大或网络不稳定时,可动态调整轮询间隔:

js 轮询实现

let retryCount = 0;
const maxRetry = 5;
const baseDelay = 1000;

function pollWithBackoff() {
  fetch('https://api.example.com/data')
    .then(response => {
      if (!response.ok) throw new Error('状态异常');
      retryCount = 0; // 成功时重置重试计数
      return response.json();
    })
    .then(data => {
      console.log('数据更新:', data);
      setTimeout(pollWithBackoff, baseDelay); // 正常延迟
    })
    .catch(error => {
      retryCount++;
      if (retryCount >= maxRetry) {
        console.error('达到最大重试次数');
        return;
      }
      const delay = baseDelay * Math.pow(2, retryCount); // 指数退避
      console.warn(`请求失败,${delay}ms后重试...`);
      setTimeout(pollWithBackoff, delay);
    });
}

pollWithBackoff();

长轮询(Long Polling)

服务器在有数据时才响应,减少无效请求:

function longPoll() {
  fetch('https://api.example.com/long-poll')
    .then(response => {
      if (response.status === 204) {
        // 无数据时立即重试
        longPoll();
      } else {
        return response.json().then(data => {
          console.log('收到数据:', data);
          longPoll(); // 处理完成后继续下一次轮询
        });
      }
    })
    .catch(error => {
      console.error('长轮询错误:', error);
      setTimeout(longPoll, 5000); // 错误时延迟重试
    });
}

longPoll();

终止轮询的条件

通过标志位或外部事件停止轮询:

let isPollingActive = true;

function conditionalPoll() {
  if (!isPollingActive) return;

  fetch('https://api.example.com/conditional')
    .then(response => response.json())
    .then(data => {
      console.log('当前数据:', data);
      if (data.status === 'COMPLETED') {
        isPollingActive = false; // 满足条件时停止
      } else {
        setTimeout(conditionalPoll, 3000);
      }
    });
}

conditionalPoll();

// 通过按钮点击停止
document.getElementById('stopButton').addEventListener('click', () => {
  isPollingActive = false;
});

注意事项

  • 性能影响:高频轮询会增加服务器负载,需合理设置间隔时间。
  • 错误处理:网络波动或服务异常时需实现重试机制。
  • 替代方案:对于高实时性需求,建议考虑 WebSocket 或 Server-Sent Events(SSE)。

标签: js
分享给朋友:

相关文章

js实现倒计时

js实现倒计时

使用 setInterval 实现倒计时 通过 setInterval 定时器每秒更新剩余时间,适用于简单倒计时场景。 function countdown(seconds, callbac…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js实现防洪

js实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(f…

js画图实现

js画图实现

使用Canvas API绘制图形 Canvas是HTML5提供的绘图API,通过JavaScript操作Canvas元素可以绘制各种图形。以下是一个简单的示例: <canvas id="myC…

js钟表实现

js钟表实现

实现JavaScript钟表的基本方法 创建一个简单的JavaScript钟表可以通过以下步骤完成,涵盖数字和模拟两种形式。 数字钟表实现 HTML结构只需一个显示时间的容器: <div i…

js实现正交

js实现正交

正交的概念 正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。 向量正交判断 判断两个向量是否正交可以通过点积是否为0来实现: fun…