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

js实现动画

使用 CSS 动画与 JavaScript 控制 通过 JavaScript 动态添加或移除 CSS 类来触发动画。CSS 定义关键帧(@keyframes),JavaScript 通过 classL…

js实现轮播图

js实现轮播图

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

js实现验证码

js实现验证码

使用Canvas生成图形验证码 在HTML中创建一个Canvas元素用于绘制验证码。通过JavaScript随机生成数字或字母组合,并添加干扰线、噪点等干扰元素增强安全性。 <canvas i…

js实现继承

js实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js实现复制到剪贴板

js实现复制到剪贴板

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

js实现列表

js实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaSc…