当前位置:首页 > JavaScript

js中实现轮询

2026-04-07 16:23:00JavaScript

轮询的基本概念

轮询是一种通过定期向服务器发送请求来检查数据更新的技术。适用于需要实时性但无法使用WebSocket或Server-Sent Events(SSE)的场景。

使用 setInterval 实现基础轮询

通过 setInterval 定时触发请求,适合简单场景:

js中实现轮询

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

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

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

使用递归 setTimeout 实现可控轮询

递归调用 setTimeout 可灵活调整间隔时间或根据条件停止:

js中实现轮询

function pollServer() {
  fetch('https://api.example.com/data')
    .then(response => response.json())
    .then(data => {
      console.log('数据更新:', data);
      if (data.needsUpdate) {
        setTimeout(pollServer, 1000); // 数据需更新时缩短间隔
      } else {
        setTimeout(pollServer, 5000); // 否则恢复默认间隔
      }
    })
    .catch(error => {
      console.error('请求失败:', error);
      setTimeout(pollServer, 10000); // 失败时延长间隔
    });
}

pollServer(); // 启动轮询

结合指数退避算法优化轮询

在网络不稳定时,通过指数退避减少请求压力:

let retryCount = 0;
const maxDelay = 60000; // 最大退避时间(毫秒)

function pollServer() {
  fetch('https://api.example.com/data')
    .then(response => {
      retryCount = 0; // 成功时重置重试计数
      return response.json();
    })
    .then(data => console.log('数据:', data))
    .catch(error => {
      retryCount++;
      const delay = Math.min(1000 * Math.pow(2, retryCount), maxDelay);
      console.error(`请求失败,${delay}ms后重试:`, error);
      setTimeout(pollServer, delay);
    });
}

pollServer();

终止轮询的条件控制

通过标志变量或AbortController主动终止请求:

let isPollingActive = true;
const controller = new AbortController();

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

  fetch('https://api.example.com/data', { signal: controller.signal })
    .then(response => response.json())
    .then(data => {
      console.log('数据:', data);
      setTimeout(pollServer, 5000);
    })
    .catch(error => {
      if (error.name !== 'AbortError') {
        console.error('请求失败:', error);
        setTimeout(pollServer, 5000);
      }
    });
}

pollServer();

// 终止轮询
function stopPolling() {
  isPollingActive = false;
  controller.abort();
}

实际应用建议

  • 频率选择:根据业务需求调整间隔,避免过高频率导致服务器压力。
  • 错误处理:添加网络异常、超时等情况的处理逻辑。
  • 兼容性:旧浏览器需使用 XMLHttpRequest 替代 fetch

标签: js
分享给朋友:

相关文章

jquery.js

jquery.js

jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互等操作。以下是关于 jQuery.js 的核心信息和使用方法: 获…

js实现交换

js实现交换

交换变量的方法 在JavaScript中,交换两个变量的值有多种方法。以下是常见的几种实现方式: 使用临时变量 通过引入一个临时变量来存储其中一个变量的值,实现交换: let a = 1; le…

js实现截图

js实现截图

使用HTML2Canvas库实现截图 HTML2Canvas是一个流行的JavaScript库,可以将网页元素或整个页面转换为Canvas图像。安装方式: npm install html2canv…

js实现递归

js实现递归

递归的基本概念 递归是一种通过函数调用自身来解决问题的方法。在JavaScript中,递归通常用于处理具有重复子问题或分治结构的数据,例如树形结构、阶乘计算等。 递归的实现要点 基线条件(Base…

js 实现进度条

js 实现进度条

使用 HTML 和 CSS 创建基础结构 进度条需要一个容器和一个填充元素。HTML 结构可以简单如下: <div class="progress-container"> <d…

vue.js 实现弹窗

vue.js 实现弹窗

Vue.js 实现弹窗的方法 使用组件化方式创建弹窗 创建一个独立的弹窗组件(如 Modal.vue),通过 v-if 或 v-show 控制显示隐藏。组件内包含弹窗的模板、样式和逻辑。 <t…