当前位置:首页 > 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分组实现

分组实现方法 在JavaScript中,可以通过多种方式实现数组或对象的分组操作。以下是几种常见的方法: 使用Array.prototype.reduce() 通过reduce方法可以轻松实现数组分…

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、图…

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…

js实现求导

js实现求导

实现数值求导的方法 在JavaScript中实现求导通常采用数值方法,因为JavaScript不是符号计算语言。以下是常见的数值微分方法: 中心差分法 中心差分法提供较高精度的导数近似: func…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的J…

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…