当前位置:首页 > JavaScript

js 实现轮询

2026-04-05 10:27:18JavaScript

轮询的基本概念

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

简单轮询实现

使用setInterval创建定时器,定期发送请求:

function simplePolling(url, interval) {
  setInterval(() => {
    fetch(url)
      .then(response => response.json())
      .then(data => console.log('Updated data:', data))
      .catch(err => console.error('Polling error:', err));
  }, interval);
}

// 使用示例
simplePolling('/api/data', 3000); // 每3秒请求一次

带错误处理的增强版轮询

增加网络错误处理和请求超时控制:

function enhancedPolling(url, interval, timeout = 5000) {
  const controller = new AbortController();
  const signal = controller.signal;

  const poll = () => {
    setTimeout(() => controller.abort(), timeout);

    fetch(url, { signal })
      .then(response => {
        if (!response.ok) throw new Error(response.statusText);
        return response.json();
      })
      .then(data => {
        console.log('New data:', data);
        setTimeout(poll, interval);
      })
      .catch(err => {
        console.error('Polling failed:', err);
        setTimeout(poll, interval * 2); // 错误时延长间隔
      });
  };

  poll();
}

指数退避策略

网络不稳定时采用指数退避算法:

function exponentialBackoffPolling(url, maxInterval = 30000) {
  let attempts = 0;
  const baseInterval = 1000;

  const poll = () => {
    const delay = Math.min(baseInterval * Math.pow(2, attempts), maxInterval);

    setTimeout(() => {
      fetch(url)
        .then(response => {
          if (!response.ok) throw new Error(response.statusText);
          attempts = 0;
          return response.json();
        })
        .then(data => {
          console.log('Data update:', data);
          poll();
        })
        .catch(err => {
          console.error(`Attempt ${attempts + 1} failed:`, err);
          attempts++;
          poll();
        });
    }, delay);
  };

  poll();
}

终止轮询的方法

需要停止轮询时可以使用以下方式:

js 实现轮询

let pollingInterval;

function startPolling() {
  pollingInterval = setInterval(() => {
    fetch('/api/data')
      .then(/* ... */);
  }, 2000);
}

function stopPolling() {
  clearInterval(pollingInterval);
}

实际应用建议

  • 重要数据轮询间隔建议不低于30秒
  • 配合ETag或Last-Modified头减少不必要的数据传输
  • 页面隐藏时(通过Visibility API)应暂停轮询
  • 考虑使用Service Worker管理后台轮询

以上实现方案可根据具体需求组合使用,比如在简单轮询基础上增加错误处理和退避策略。

标签: js
分享给朋友:

相关文章

js实现图片轮播

js实现图片轮播

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

js实现乘

js实现乘

JavaScript 实现乘法运算 在 JavaScript 中实现乘法运算可以通过多种方式完成,包括基本运算符、函数封装以及高级算法(如大数乘法)。以下是几种常见方法: 使用基本乘法运算符 Jav…

js分组实现

js分组实现

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

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…

链表实现js

链表实现js

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

vue实现js休眠

vue实现js休眠

实现 JavaScript 休眠的方法 在 Vue 中实现 JavaScript 休眠(延迟执行)可以通过以下方式实现。由于 JavaScript 本身没有内置的 sleep 函数,通常使用 Prom…