当前位置:首页 > JavaScript

js实现轮询

2026-03-14 08:02:28JavaScript

轮询的基本概念

轮询(Polling)是一种客户端定期向服务器发送请求以获取最新数据的技术。适用于实时性要求不高或无法使用WebSocket等长连接的场景。

使用 setInterval 实现基础轮询

通过 setInterval 定时发起请求,适合简单场景:

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

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

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

使用 setTimeout 实现递归轮询

更灵活的递归方式,可动态调整间隔或根据条件停止:

function pollServer() {
    fetch('/api/data')
        .then(response => response.json())
        .then(data => {
            console.log('Data:', data);
            if (data.needsUpdate) {
                setTimeout(pollServer, 1000); // 数据需要更新时加快轮询
            } else {
                setTimeout(pollServer, 5000); // 否则恢复默认间隔
            }
        })
        .catch(error => {
            console.error('Polling error:', error);
            setTimeout(pollServer, 10000); // 出错时延长间隔
        });
}

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

带退避策略的轮询

网络异常时采用指数退避(Exponential Backoff)减少请求压力:

let retryCount = 0;
const MAX_RETRIES = 5;
const BASE_DELAY = 1000;

function pollServerWithBackoff() {
    fetch('/api/data')
        .then(response => {
            if (!response.ok) throw new Error('Server error');
            return response.json();
        })
        .then(data => {
            retryCount = 0; // 重置重试计数
            console.log('Data:', data);
            setTimeout(pollServerWithBackoff, 5000);
        })
        .catch(error => {
            if (retryCount < MAX_RETRIES) {
                const delay = BASE_DELAY * Math.pow(2, retryCount);
                retryCount++;
                console.warn(`Retrying in ${delay}ms...`);
                setTimeout(pollServerWithBackoff, delay);
            } else {
                console.error('Max retries reached');
            }
        });
}

pollServerWithBackoff();

结合 AbortController 控制轮询终止

通过 AbortController 实现请求取消,避免内存泄漏:

js实现轮询

const abortController = new AbortController();

function controlledPolling() {
    fetch('/api/data', { signal: abortController.signal })
        .then(response => response.json())
        .then(data => {
            console.log('Data:', data);
            setTimeout(controlledPolling, 3000);
        })
        .catch(error => {
            if (error.name === 'AbortError') {
                console.log('Polling stopped');
            } else {
                console.error('Error:', error);
                setTimeout(controlledPolling, 3000);
            }
        });
}

controlledPolling();

// 终止轮询
// abortController.abort();

注意事项

  • 性能影响:高频轮询会增加服务器负载,需合理设置间隔时间。
  • 竞态条件:确保前一次请求完成后再发起下一次请求,避免响应顺序错乱。
  • 替代方案:对于高实时性需求,建议考虑WebSocket或Server-Sent Events(SSE)。

标签: js
分享给朋友:

相关文章

js实现验证码

js实现验证码

实现验证码的JavaScript方法 生成随机验证码 使用Math.random()生成随机字符串,结合数字和字母: function generateCaptcha() { const cha…

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…

js实现vr

js实现vr

使用WebXR API实现VR体验 WebXR是浏览器中实现VR和AR体验的标准API,它取代了早期的WebVR。现代浏览器如Chrome、Edge和Firefox已支持WebXR。 // 初始化W…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…

js 实现验证码

js 实现验证码

实现验证码的 JavaScript 方法 生成随机验证码 验证码通常由随机字符(数字、字母或混合)组成。以下代码生成一个 6 位随机验证码(数字和字母混合): function generateCa…

实现图片旋转js

实现图片旋转js

使用CSS transform属性旋转图片 通过CSS的transform属性可以轻松实现图片旋转。以下是一个简单的示例代码: const image = document.getElement…