当前位置:首页 > JavaScript

Js轮训实现

2026-02-01 15:29:15JavaScript

轮询的实现方法

轮询(Polling)是一种客户端定期向服务器发送请求以获取最新数据的技术。适用于实时性要求不高的场景,实现简单但可能增加服务器负载。

使用setInterval实现基础轮询

通过setInterval定时发送请求,适合固定间隔的轮询需求。

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

  // 返回清除函数
  return () => clearInterval(poll);
}

// 使用示例
const stopPolling = startPolling('/api/data', 3000);

// 需要停止时调用
// stopPolling();

使用setTimeout实现递归轮询

递归方式更灵活,可根据响应结果动态调整下次轮询时间。

function recursivePoll(url, delay) {
  setTimeout(async () => {
    try {
      const response = await fetch(url);
      const data = await response.json();
      console.log('Data update:', data);

      // 根据业务逻辑调整下次轮询时间
      const nextDelay = data.requiresQuickUpdate ? 1000 : 3000;
      recursivePoll(url, nextDelay);
    } catch (error) {
      console.error('Polling failed:', error);
      recursivePoll(url, Math.min(delay * 2, 60000)); // 退避策略
    }
  }, delay);
}

// 启动轮询
recursivePoll('/api/status', 2000);

带退避策略的轮询

网络异常时采用指数退避算法,避免雪崩效应。

const MAX_DELAY = 60000;
const BASE_DELAY = 1000;

function smartPoll(url, delay = BASE_DELAY) {
  fetch(url)
    .then(response => {
      if (!response.ok) throw new Error('Server error');
      return response.json();
    })
    .then(data => {
      console.log('New data:', data);
      smartPoll(url, BASE_DELAY); // 成功时重置延迟
    })
    .catch(error => {
      console.warn(`Retrying in ${delay}ms`, error);
      const nextDelay = Math.min(delay * 2, MAX_DELAY);
      setTimeout(() => smartPoll(url, nextDelay), delay);
    });
}

轮询优化建议

  1. 条件轮询:在响应头中携带Last-ModifiedETag,减少不必要的数据传输
  2. 取消机制:使用AbortController实现请求取消
  3. 页面可见性:当标签页不可见时暂停轮询
// 带取消功能的实现
function cancellablePoll(url, interval) {
  const controller = new AbortController();

  const poll = setInterval(async () => {
    try {
      const response = await fetch(url, {
        signal: controller.signal
      });
      // 处理数据...
    } catch (e) {
      if (e.name !== 'AbortError') {
        console.error(e);
      }
    }
  }, interval);

  return () => {
    clearInterval(poll);
    controller.abort();
  };
}

替代方案考虑

对于高实时性要求的场景,建议考虑:

Js轮训实现

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

轮询实现应根据具体业务需求选择适当间隔和错误处理策略,平衡实时性和服务器压力。

标签: Js
分享给朋友:

相关文章

Js实现划词翻译

Js实现划词翻译

实现划词翻译的基本思路 划词翻译的核心是监听用户鼠标选中文本的事件,获取选中内容后调用翻译API,最后以弹窗等形式展示翻译结果。以下是具体实现方法: 监听文本选中事件 通过mouseup事件监听用户…

Js实现对齐

Js实现对齐

使用CSS实现文本对齐 CSS提供了多种文本对齐方式,通过text-align属性可以轻松实现左对齐、右对齐、居中对齐和两端对齐。例如: .left-align { text-align: le…

Js 扫描实现

Js 扫描实现

实现 JavaScript 扫描功能 JavaScript 扫描功能通常涉及文件系统遍历、内容分析或网络请求监控。以下是几种常见场景的实现方法: 文件系统扫描 使用 Node.js 的 fs 模块可…

Js实现allkeys

Js实现allkeys

实现 allKeys 方法 在 JavaScript 中,allKeys 方法通常用于获取对象的所有可枚举属性(包括原型链上的属性)。以下是几种实现方式: 使用 for...in 循环 通过 for…

怎么用Js实现图片移动

怎么用Js实现图片移动

使用CSS和JavaScript实现图片移动 通过修改图片的CSS属性(如left、top或transform)可以实现图片移动效果。以下是两种常见方法: 方法一:通过修改left和top属性 假设…