当前位置:首页 > JavaScript

js 实现轮询

2026-01-31 18:10:37JavaScript

轮询的基本概念

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

js 实现轮询

简单轮询实现

通过 setInterval 定时发起请求,代码示例:

js 实现轮询

function pollServer() {
  fetch('https://api.example.com/data')
    .then(response => response.json())
    .then(data => console.log('更新数据:', data))
    .catch(error => console.error('请求失败:', error));
}

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

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

指数退避轮询

当服务器压力大时,可采用指数退避策略动态调整轮询间隔:

let retryCount = 0;
const maxRetries = 5;
const baseDelay = 1000; // 初始延迟1秒

function pollWithBackoff() {
  fetch('https://api.example.com/data')
    .then(response => {
      if (!response.ok) throw new Error('请求失败');
      retryCount = 0; // 成功时重置重试计数
      return response.json();
    })
    .then(data => {
      console.log('数据更新:', data);
      setTimeout(pollWithBackoff, baseDelay); // 正常延迟
    })
    .catch(error => {
      retryCount++;
      if (retryCount > maxRetries) {
        console.error('达到最大重试次数');
        return;
      }
      const delay = baseDelay * Math.pow(2, retryCount);
      console.log(`第${retryCount}次重试,延迟${delay}ms`);
      setTimeout(pollWithBackoff, delay);
    });
}

pollWithBackoff();

基于Promise的轮询

结合 async/await 实现更可控的轮询逻辑:

async function pollUntilCondition(conditionFn, interval = 3000) {
  while (true) {
    try {
      const response = await fetch('https://api.example.com/status');
      const data = await response.json();
      if (conditionFn(data)) {
        console.log('条件满足:', data);
        return data;
      }
      await new Promise(resolve => setTimeout(resolve, interval));
    } catch (error) {
      console.error('轮询异常:', error);
      await new Promise(resolve => setTimeout(resolve, interval));
    }
  }
}

// 使用示例:检测任务是否完成
pollUntilCondition(data => data.status === 'completed');

注意事项

  • 性能优化:避免高频轮询,根据业务需求合理设置间隔时间。
  • 错误处理:添加网络异常和服务器错误的重试机制。
  • 资源释放:在页面卸载时清除轮询(如 beforeunload 事件中调用 clearInterval)。

标签: js
分享给朋友:

相关文章

js实现类

js实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统的…

js实现复制到剪贴板

js实现复制到剪贴板

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

js画图实现

js画图实现

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

链表实现js

链表实现js

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针(单向链表)或两个指针(双向链表)。与数组不同,链表在内存中非连续存储,插入和删除操作更高效,但随机…

节流js实现

节流js实现

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

js实现文字滚动

js实现文字滚动

实现文字滚动的几种方法 使用CSS动画实现滚动 通过CSS的@keyframes和transform属性可以实现平滑的文字滚动效果。 <style> .scroll-text { w…