当前位置:首页 > JavaScript

Js轮训实现

2026-02-01 15:29:15JavaScript

轮询的实现方法

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

使用setInterval实现基础轮询

通过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:', data);
    } catch (error) {
      console.error('Polling error:', error);
    }
  }, interval);

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

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

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

使用setTimeout实现递归轮询

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

Js轮训实现

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();
  };
}

替代方案考虑

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

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

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

标签: Js
分享给朋友:

相关文章

怎么用Js实现图片移动

怎么用Js实现图片移动

使用JavaScript实现图片移动 通过修改CSS属性实现移动 使用JavaScript动态修改图片的style.left和style.top属性可以实现移动效果。需要将图片的position属性设…

Js实现划词翻译

Js实现划词翻译

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

Js实现冰墩墩

Js实现冰墩墩

使用Canvas绘制冰墩墩 在JavaScript中,可以通过Canvas API绘制冰墩墩形象。以下是实现的基本代码框架: const canvas = document.getElementB…

Js实现reset

Js实现reset

使用 HTMLFormElement.reset() 方法 通过 JavaScript 直接调用表单的 reset() 方法可以重置表单内的所有输入字段为初始值: document.getElem…

Js实现utext

Js实现utext

JavaScript 实现 UText(用户文本处理) 在 JavaScript 中实现 UText(User Text)处理通常涉及文本操作、格式化或自定义功能。以下是几种常见的实现方法: 字符串…

Js实现const

Js实现const

在 JavaScript 中,const 是用于声明常量的关键字,其值在声明后不能被重新赋值。以下是关于 const 的详细说明和用法: 基本语法 const identifier = value…