当前位置:首页 > JavaScript

js中实现轮询

2026-04-07 16:23:00JavaScript

轮询的基本概念

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

使用 setInterval 实现基础轮询

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

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 可灵活调整间隔时间或根据条件停止:

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主动终止请求:

js中实现轮询

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
分享给朋友:

相关文章

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…

js计算器的实现

js计算器的实现

实现基础结构 HTML部分需要创建计算器的基本框架,包含显示区域和按钮。使用<div>容器包裹整个计算器,内部设置一个显示屏和多个按钮。 <div class="calculato…

js实现文件夹

js实现文件夹

使用JavaScript创建文件夹 在浏览器端的JavaScript中无法直接操作文件系统创建文件夹,这是出于安全考虑。但在Node.js环境中可以通过文件系统模块(fs)实现。 Node.js中使…

js实现上传图片预览

js实现上传图片预览

使用FileReader实现图片预览 通过FileReader对象读取用户选择的图片文件,并将其显示在页面上。这种方法适用于现代浏览器。 // HTML部分 <input type="file…

js尚未实现

js尚未实现

JavaScript 尚未实现的功能 JavaScript 作为一门不断发展的语言,仍有一些功能尚未被原生支持或标准化。以下是一些常见的尚未实现的功能或特性: Promise.any() 的替代方案…

js实现递归

js实现递归

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