当前位置:首页 > JavaScript

js 实现轮询

2026-03-13 16:04:32JavaScript

使用 setInterval 实现轮询

通过 setInterval 可以定期执行某个函数,适合简单的轮询场景。

const pollInterval = setInterval(() => {
  fetch('https://api.example.com/data')
    .then(response => response.json())
    .then(data => {
      if (data.ready) {
        clearInterval(pollInterval);
        console.log('Data ready:', data);
      }
    })
    .catch(error => console.error('Polling error:', error));
}, 2000); // 每2秒轮询一次

使用 setTimeout 递归实现轮询

递归调用 setTimeout 可以更灵活地控制轮询间隔,避免 setInterval 的潜在问题(如请求堆积)。

js 实现轮询

function poll() {
  fetch('https://api.example.com/data')
    .then(response => response.json())
    .then(data => {
      if (data.ready) {
        console.log('Data ready:', data);
      } else {
        setTimeout(poll, 2000); // 未就绪时,2秒后重试
      }
    })
    .catch(error => {
      console.error('Polling error:', error);
      setTimeout(poll, 2000); // 错误时,2秒后重试
    });
}

poll(); // 启动轮询

结合指数退避策略

指数退避可以避免频繁轮询对服务器造成压力,适合高延迟或不确定响应时间的场景。

js 实现轮询

function pollWithBackoff(initialDelay = 1000, maxDelay = 30000) {
  let currentDelay = initialDelay;

  function poll() {
    fetch('https://api.example.com/data')
      .then(response => response.json())
      .then(data => {
        if (data.ready) {
          console.log('Data ready:', data);
        } else {
          currentDelay = Math.min(currentDelay * 2, maxDelay);
          setTimeout(poll, currentDelay);
        }
      })
      .catch(error => {
        console.error('Polling error:', error);
        currentDelay = Math.min(currentDelay * 2, maxDelay);
        setTimeout(poll, currentDelay);
      });
  }

  poll(); // 启动轮询
}

pollWithBackoff();

使用 AbortController 取消轮询

通过 AbortController 可以手动终止轮询,避免不必要的网络请求。

const abortController = new AbortController();

function poll() {
  fetch('https://api.example.com/data', {
    signal: abortController.signal
  })
    .then(response => response.json())
    .then(data => {
      if (data.ready) {
        console.log('Data ready:', data);
      } else {
        setTimeout(poll, 2000);
      }
    })
    .catch(error => {
      if (error.name !== 'AbortError') {
        console.error('Polling error:', error);
        setTimeout(poll, 2000);
      }
    });
}

poll();

// 需要取消时调用
// abortController.abort();

结合 async/await 的轮询实现

使用 async/await 可以让代码更易读,适合现代 JavaScript 开发。

async function poll() {
  try {
    const response = await fetch('https://api.example.com/data');
    const data = await response.json();

    if (data.ready) {
      console.log('Data ready:', data);
    } else {
      await new Promise(resolve => setTimeout(resolve, 2000));
      await poll(); // 递归调用
    }
  } catch (error) {
    console.error('Polling error:', error);
    await new Promise(resolve => setTimeout(resolve, 2000));
    await poll(); // 递归调用
  }
}

poll();

标签: js
分享给朋友:

相关文章

js实现图片上传

js实现图片上传

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现图片上传功能。HTML部分需要创建一个文件选择输入框和一个用于…

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:…

js实现祖玛

js实现祖玛

实现祖玛游戏的核心思路 祖玛游戏的核心玩法是发射彩色珠子,形成三个或以上相同颜色的珠子即可消除。以下是使用JavaScript实现的基本框架。 游戏初始化 创建画布并初始化游戏状态: const…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的J…

利用js实现

利用js实现

使用 JavaScript 实现 在 JavaScript 中,可以通过多种方式实现功能,具体取决于需求。以下是几种常见的方法: 方法一:使用原生 JavaScript // 示例代码…