当前位置:首页 > JavaScript

js轮询实现

2026-02-02 03:46:12JavaScript

轮询的基本概念

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

简单轮询实现

使用 setInterval 实现基础轮询,间隔固定时间请求数据:

js轮询实现

function startPolling(url, interval) {
  const poll = setInterval(async () => {
    try {
      const response = await fetch(url);
      const data = await response.json();
      console.log('Received:', data);
    } catch (error) {
      console.error('Polling error:', error);
    }
  }, interval);

  // 返回停止函数
  return () => clearInterval(poll);
}

// 使用示例
const stopPolling = startPolling('/api/data', 3000);
// 需要停止时调用 stopPolling();

带退避策略的轮询

增加错误处理和动态间隔调整,避免频繁失败请求:

js轮询实现

function startSmartPolling(url, initialInterval, maxInterval) {
  let currentInterval = initialInterval;

  const poll = async () => {
    try {
      const response = await fetch(url);
      const data = await response.json();
      console.log('Received:', data);
      currentInterval = initialInterval; // 成功时重置间隔
    } catch (error) {
      console.error('Polling error:', error);
      currentInterval = Math.min(currentInterval * 2, maxInterval); // 指数退避
    }
    setTimeout(poll, currentInterval);
  };

  poll();
  return () => clearTimeout(poll);
}

基于Promise的轮询

实现更精细的控制流程:

function promisePoll(fn, validate, interval) {
  const check = async () => {
    const result = await fn();
    if (validate(result)) {
      return result;
    }
    await new Promise(resolve => setTimeout(resolve, interval));
    return check();
  };
  return check();
}

// 使用示例
promisePoll(
  () => fetch('/api/status').then(r => r.json()),
  data => data.status === 'ready',
  1000
).then(finalData => console.log('Done:', finalData));

轮询优化建议

  • 添加请求取消逻辑(AbortController)
  • 考虑使用指数退避算法减少无效请求
  • 重要数据请求添加重试机制
  • 页面隐藏时(visibilitychange)暂停轮询

替代方案考虑

对于高实时性需求场景,建议评估以下技术:

  • WebSocket 双向通信
  • Server-Sent Events (SSE) 服务器推送
  • Long Polling 长轮询技术

标签: js
分享给朋友:

相关文章

js实现vue路由

js实现vue路由

Vue路由基础实现 使用Vue Router实现前端路由需要先安装并配置路由库。Vue Router是Vue.js官方的路由管理器。 安装Vue Router: npm install vue-r…

js实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.j…

js实现日历

js实现日历

实现日历的基本思路 使用JavaScript实现日历的核心是动态生成日期表格,并处理月份切换逻辑。需要计算当前月的天数、起始星期几,并动态渲染到页面上。 获取当前日期信息 通过Date对象获取当前年…

js实现自举

js实现自举

实现 JavaScript 自举的方法 JavaScript 自举(Bootstrap)通常指通过 JavaScript 动态加载自身或依赖的脚本,实现运行时环境的初始化或扩展。以下是几种常见实现方式…

节流js实现

节流js实现

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

js 实现按钮点击

js 实现按钮点击

实现按钮点击的 JavaScript 方法 HTML 按钮元素 在 HTML 中创建一个按钮,可以通过 <button> 或 <input> 标签实现: <button…