当前位置:首页 > JavaScript

js实现轮询

2026-02-01 09:25:42JavaScript

轮询的基本概念

轮询是一种客户端定期向服务器发送请求以获取最新数据的技术。适用于需要实时更新但无法使用WebSocket或Server-Sent Events的场景。

使用setInterval实现基础轮询

通过setInterval定时发起请求,以下是一个简单示例:

js实现轮询

function pollServer() {
  fetch('/api/data')
    .then(response => response.json())
    .then(data => {
      console.log('Received data:', data);
    })
    .catch(error => {
      console.error('Polling error:', error);
    });
}

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

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

带退避策略的轮询

当服务器负载较高时,可采用指数退避策略:

js实现轮询

let retryDelay = 1000;
const maxDelay = 60000;

function pollWithBackoff() {
  fetch('/api/data')
    .then(response => {
      retryDelay = 1000; // 成功时重置延迟
      return response.json();
    })
    .then(data => {
      console.log('Data received:', data);
      setTimeout(pollWithBackoff, 5000);
    })
    .catch(error => {
      console.error('Error:', error);
      retryDelay = Math.min(retryDelay * 2, maxDelay);
      setTimeout(pollWithBackoff, retryDelay);
    });
}

pollWithBackoff();

条件轮询实现

仅在特定条件满足时继续轮询:

let shouldPoll = true;

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

  fetch('/api/status')
    .then(response => response.json())
    .then(data => {
      if (data.needsUpdate) {
        fetch('/api/data').then(/* ... */);
      }
      setTimeout(conditionalPoll, 3000);
    });
}

conditionalPoll();

// 停止条件
// shouldPoll = false;

基于Promise的轮询

封装为可复用的Promise链式调用:

function createPoller(url, interval, callback) {
  let stopped = false;

  const executePoll = () => {
    if (stopped) return;

    fetch(url)
      .then(response => response.json())
      .then(data => {
        callback(null, data);
        setTimeout(executePoll, interval);
      })
      .catch(err => {
        callback(err);
        setTimeout(executePoll, interval);
      });
  };

  executePoll();

  return {
    stop: () => { stopped = true; }
  };
}

// 使用示例
const poller = createPoller('/api/data', 2000, (err, data) => {
  if (err) return console.error(err);
  console.log('Polling data:', data);
});

// 停止
// poller.stop();

轮询的优化建议

  • 添加请求取消逻辑,避免组件卸载时继续请求
  • 考虑使用AbortController中断正在进行的请求
  • 对于重要数据,可结合本地缓存进行比较
  • 在页面不可见时(通过Page Visibility API)暂停轮询

以上实现方案可根据具体需求进行组合或调整,注意在SPA应用中组件卸载时清除轮询定时器。

标签: js
分享给朋友:

相关文章

js实现倒计时

js实现倒计时

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

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

js实现选项卡

js实现选项卡

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

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…

js实现vr

js实现vr

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

js实现图片

js实现图片

图片加载与显示 在JavaScript中,可以通过Image对象动态加载图片。创建实例后设置src属性触发加载,通过onload回调处理加载完成后的操作: const img = new Ima…