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

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

Js实现decimal

Js实现decimal

实现 Decimal 类型的方法 在 JavaScript 中,原生不支持精确的 Decimal 类型,但可以通过以下方法实现高精度小数运算。 使用第三方库 推荐使用成熟的第三方库来处理 Decim…

Js实现allkeys

Js实现allkeys

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

Js实现划词翻译

Js实现划词翻译

划词翻译的实现思路 划词翻译功能可以通过监听用户鼠标选中文本的事件,获取选中的文本内容,然后调用翻译API进行翻译,最后将翻译结果显示在页面上。 获取选中文本 通过window.getSelecti…

Js实现reset

Js实现reset

重置表单元素 在JavaScript中重置表单可以通过调用表单元素的reset()方法实现。该方法会将所有表单控件恢复到初始值。 document.getElementById('myForm').…