当前位置:首页 > JavaScript

js中实现轮询

2026-03-15 23:00:13JavaScript

轮询的基本概念

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

使用 setInterval 实现基础轮询

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

js中实现轮询

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(); // 启动轮询

指数退避策略优化

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

js中实现轮询

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();

终止轮询的注意事项

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

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 实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是两种常见实现方式。 使用 setInterval 实…

js实现全选

js实现全选

实现全选功能的方法 在JavaScript中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选框…

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js实现vr

js实现vr

使用WebXR API实现VR体验 WebXR是浏览器中实现VR和AR体验的标准API,它取代了早期的WebVR。现代浏览器如Chrome、Edge和Firefox已支持WebXR。 // 初始化W…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…

js画图实现

js画图实现

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