当前位置:首页 > JavaScript

js中实现轮询

2026-03-15 23:00:13JavaScript

轮询的基本概念

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

使用 setInterval 实现基础轮询

通过 setInterval 定时发起请求,代码简洁但可能因网络延迟导致请求堆积:

function pollServer() {
  fetch('/api/check-update')
    .then(response => response.json())
    .then(data => {
      if (data.updated) {
        // 处理更新逻辑
      }
    });
}
const pollInterval = setInterval(pollServer, 5000); // 每5秒轮询一次

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

递归 setTimeout 实现可控轮询

递归调用 setTimeout 可在每次请求完成后调整下次轮询时间,避免请求重叠:

function pollWithTimeout() {
  fetch('/api/check-update')
    .then(response => response.json())
    .then(data => {
      if (data.updated) {
        // 处理更新逻辑
      }
      setTimeout(pollWithTimeout, 5000); // 下一次轮询
    })
    .catch(error => {
      console.error('轮询失败:', error);
      setTimeout(pollWithTimeout, 10000); // 失败时延长间隔
    });
}
pollWithTimeout(); // 启动轮询

指数退避策略优化

在网络不稳定时,采用指数退避逐步增加轮询间隔:

let retryDelay = 1000;
const maxDelay = 60000;

function pollWithBackoff() {
  fetch('/api/check-update')
    .then(response => {
      retryDelay = 1000; // 成功时重置延迟
      return response.json();
    })
    .then(data => {
      if (data.updated) {
        // 处理更新逻辑
      }
      setTimeout(pollWithBackoff, 5000);
    })
    .catch(error => {
      retryDelay = Math.min(retryDelay * 2, maxDelay);
      console.error(`请求失败,${retryDelay / 1000}秒后重试`);
      setTimeout(pollWithBackoff, retryDelay);
    });
}
pollWithBackoff();

基于条件的动态轮询

根据业务需求动态调整轮询频率(如无更新时延长间隔):

let currentInterval = 5000;

function dynamicPoll() {
  fetch('/api/check-update')
    .then(response => response.json())
    .then(data => {
      if (data.updated) {
        currentInterval = 2000; // 高频轮询
        // 处理更新逻辑
      } else {
        currentInterval = 10000; // 低频轮询
      }
      setTimeout(dynamicPoll, currentInterval);
    });
}
dynamicPoll();

终止轮询的注意事项

确保在组件卸载或页面跳转时清理轮询,避免内存泄漏:

js中实现轮询

let pollTimer;

function startPolling() {
  function poll() {
    fetch('/api/data').then(/* ... */);
    pollTimer = setTimeout(poll, 3000);
  }
  poll();
}

// 清理函数示例
function stopPolling() {
  if (pollTimer) {
    clearTimeout(pollTimer);
  }
}

// 页面卸载时调用 stopPolling()

性能优化建议

  • 请求去重:避免并发重复请求。
  • 轻量响应:要求API返回最小必要数据。
  • 条件请求:使用 Last-ModifiedETag 头部减少数据传输。
  • 退避上限:设置最大重试间隔(如60秒)。

标签: js
分享给朋友:

相关文章

js实现轮播图

js实现轮播图

轮播图实现方法 基础HTML结构 <div class="slider"> <div class="slides"> <img src="image1.jpg…

css3结合js制作

css3结合js制作

CSS3 结合 JavaScript 制作动态效果 CSS3 和 JavaScript 结合可以实现丰富的动态效果,包括动画、交互和响应式设计。以下是几种常见的实现方式: CSS3 动画与 Java…

js实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.j…

js实现计算器

js实现计算器

实现基础计算器功能 使用JavaScript创建一个基础计算器需要处理数字输入、运算符逻辑和结果显示。以下是一个简单的实现示例: let currentInput = '0'; let previo…

js实现文件下载

js实现文件下载

使用 a 标签下载文件 通过动态创建 a 标签并设置 download 属性实现文件下载。适用于已知文件 URL 或 Blob 数据的情况。 function downloadFile(url, f…

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…