当前位置:首页 > JavaScript

js实现轮训

2026-02-02 07:58:11JavaScript

轮询的基本概念

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

使用 setInterval 实现基础轮询

通过 setInterval 定时发起请求,适合简单的轮询需求:

js实现轮训

function pollServer() {
  fetch('https://api.example.com/data')
    .then(response => response.json())
    .then(data => console.log('Updated data:', data))
    .catch(error => console.error('Polling error:', error));
}

const pollingInterval = setInterval(pollServer, 5000); // 每5秒轮询一次

// 停止轮询
// clearInterval(pollingInterval);

使用 setTimeout 实现递归轮询

通过递归调用 setTimeout 实现更灵活的控制(如根据响应动态调整间隔):

js实现轮训

function pollServer() {
  fetch('https://api.example.com/data')
    .then(response => response.json())
    .then(data => {
      console.log('Data received:', data);
      setTimeout(pollServer, data.nextPollDelay || 3000); // 动态调整下次轮询时间
    })
    .catch(error => {
      console.error('Polling failed:', error);
      setTimeout(pollServer, 10000); // 失败时延长间隔
    });
}

pollServer(); // 启动首次轮询

带终止条件的轮询示例

通过标志变量或外部事件控制轮询的启停:

let isPollingActive = true;

function pollServer() {
  if (!isPollingActive) return;

  fetch('https://api.example.com/status')
    .then(response => response.json())
    .then(data => {
      if (data.complete) {
        console.log('Task completed!');
        isPollingActive = false;
      } else {
        setTimeout(pollServer, 2000);
      }
    });
}

pollServer();

// 终止轮询
// isPollingActive = false;

结合指数退避的轮询

在错误发生时采用指数退避策略,减少无效请求:

let retryDelay = 1000; // 初始延迟1秒

function pollWithBackoff() {
  fetch('https://api.example.com/data')
    .then(response => {
      if (!response.ok) throw new Error('Server error');
      return response.json();
    })
    .then(data => {
      retryDelay = 1000; // 成功后重置延迟
      console.log('Data:', data);
      setTimeout(pollWithBackoff, 5000); // 正常轮询间隔
    })
    .catch(error => {
      console.error('Error, retrying...');
      retryDelay *= 2; // 延迟时间翻倍
      setTimeout(pollWithBackoff, Math.min(retryDelay, 30000)); // 上限30秒
    });
}

pollWithBackoff();

注意事项

  • 性能影响:频繁轮询可能增加服务器压力,需合理设置间隔时间。
  • 实时性需求:高实时性场景建议改用 WebSocket 或 Server-Sent Events(SSE)。
  • 错误处理:添加网络异常和服务器错误的容错机制。

标签: js
分享给朋友:

相关文章

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 使用JavaScript实现拖拽功能需要监听鼠标事件,包括mousedown、mousemove和mouseup。以下是实现的基本逻辑: const draggableEleme…

js 实现倒计时

js 实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是两种常见实现方式。 使用 setInterval 实…

js 实现继承

js 实现继承

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

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js实现拷贝

js实现拷贝

实现文本拷贝 使用 document.execCommand 方法(已废弃但兼容性较好): function copyText(text) { const textarea = documen…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置…