当前位置:首页 > 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 的潜在问题(如请求堆积)。

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(); // 启动轮询

结合指数退避策略

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

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 开发。

js 实现轮询

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实现文件下载

使用 a 标签下载文件 通过动态创建 a 标签并设置 download 属性实现文件下载。适用于已知文件 URL 或 Blob 数据的情况。 function downloadFile(url, f…

js实现tab选项卡切换

js实现tab选项卡切换

实现Tab选项卡切换的JavaScript方法 使用纯JavaScript实现Tab切换功能,可以通过监听点击事件动态切换内容显示状态。以下是两种常见实现方式: 基础DOM操作实现 /…

jquery js

jquery js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够更高…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…

js实现下拉菜单

js实现下拉菜单

使用HTML和CSS创建基础结构 HTML部分需要包含一个触发下拉的按钮和隐藏的下拉菜单内容: <div class="dropdown"> <button class="dr…

js实现滚动

js实现滚动

实现滚动效果的方法 在JavaScript中实现滚动效果可以通过多种方式完成,以下是一些常见的方法: 使用window.scrollTo() window.scrollTo()方法可以将页面滚动到指…