当前位置:首页 > JavaScript

js 轮询实现

2026-03-15 08:13:13JavaScript

轮询的基本概念

轮询是一种客户端定期向服务器发送请求以检查数据更新的技术。适用于实时性要求不高的场景,但可能增加服务器负担。

简单轮询实现

使用 setInterval 定时发起请求:

function pollServer() {
  fetch('/api/check-updates')
    .then(response => response.json())
    .then(data => {
      if (data.hasUpdates) {
        // 处理更新
      }
    });
}

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

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

带退避策略的轮询

当无更新时逐步延长轮询间隔:

let retryDelay = 1000;
const maxDelay = 60000;

function smartPoll() {
  fetch('/api/check')
    .then(res => res.json())
    .then(data => {
      if (data.updated) {
        retryDelay = 1000; // 重置延迟
        // 处理数据
      } else {
        retryDelay = Math.min(retryDelay * 2, maxDelay);
      }
      setTimeout(smartPoll, retryDelay);
    });
}

smartPoll(); // 启动

错误处理增强版

添加网络错误处理和重试机制:

let retryCount = 0;
const MAX_RETRIES = 3;

function robustPoll() {
  fetch('/api/data')
    .then(response => {
      if (!response.ok) throw new Error('Server error');
      return response.json();
    })
    .then(handleData)
    .catch(error => {
      if (retryCount < MAX_RETRIES) {
        retryCount++;
        setTimeout(robustPoll, 2000 * retryCount);
      } else {
        console.error('Polling failed after retries');
      }
    });
}

function handleData(data) {
  retryCount = 0; // 成功时重置计数器
  // 业务逻辑处理
  setTimeout(robustPoll, 5000); // 正常轮询间隔
}

基于Promise的链式轮询

实现请求完成后再发起下一次请求的模式:

js 轮询实现

function chainPoll() {
  return fetch('/api/items')
    .then(res => res.json())
    .then(data => {
      // 处理数据
      return new Promise(resolve => {
        setTimeout(() => {
          resolve(chainPoll());
        }, 3000);
      });
    });
}

chainPoll(); // 启动链式调用

性能优化建议

  • 对于频繁更新的数据,考虑WebSocket替代方案
  • 添加请求取消逻辑(使用AbortController)
  • 在页面不可见时(document.visibilityState)暂停轮询
  • 服务端应设置适当的缓存控制头

标签: js
分享给朋友:

相关文章

js实现轮播图

js实现轮播图

基础轮播图实现 使用HTML、CSS和JavaScript实现一个简单的自动轮播图。HTML结构包含一个容器和多个图片项。 <div class="slider"> <div…

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在HT…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…

js实现求导

js实现求导

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

js实现投球

js实现投球

实现投球动画的基本思路 使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。 创建基础HTML结构 <…