当前位置:首页 > JavaScript

js实现poll函数

2026-03-15 19:20:33JavaScript

实现 Poll 函数的方法

在 JavaScript 中,poll 函数通常用于定期检查某个条件是否满足,直到条件为真或超时。以下是几种实现方式:

js实现poll函数

基础实现

使用 setInterval 定期检查条件,满足后清除定时器:

js实现poll函数

function poll(fn, condition, interval = 100, timeout = 5000) {
  const endTime = Date.now() + timeout;
  const checkCondition = () => {
    const result = fn();
    if (condition(result)) {
      return Promise.resolve(result);
    }
    if (Date.now() > endTime) {
      return Promise.reject(new Error('Timeout exceeded'));
    }
    return new Promise(resolve => {
      setTimeout(() => resolve(checkCondition()), interval);
    });
  };
  return checkCondition();
}

使用 async/await

更现代的异步实现方式:

async function poll(fn, condition, interval = 100, timeout = 5000) {
  const endTime = Date.now() + timeout;
  while (true) {
    const result = await fn();
    if (condition(result)) return result;
    if (Date.now() > endTime) throw new Error('Timeout exceeded');
    await new Promise(resolve => setTimeout(resolve, interval));
  }
}

带取消功能的实现

添加取消机制,允许提前终止轮询:

function cancellablePoll(fn, condition, interval = 100, timeout = 5000) {
  let timer;
  let rejected = false;
  const promise = new Promise((resolve, reject) => {
    const endTime = Date.now() + timeout;
    const checkCondition = () => {
      if (rejected) return;
      const result = fn();
      if (condition(result)) {
        resolve(result);
      } else if (Date.now() > endTime) {
        reject(new Error('Timeout exceeded'));
      } else {
        timer = setTimeout(checkCondition, interval);
      }
    };
    checkCondition();
  });
  promise.cancel = () => {
    clearTimeout(timer);
    rejected = true;
  };
  return promise;
}

使用示例

// 检查某个元素是否出现在DOM中
poll(
  () => document.querySelector('.target-element'),
  element => element !== null,
  200,
  10000
).then(element => {
  console.log('Element found:', element);
}).catch(err => {
  console.error('Polling failed:', err);
});

// 可取消的示例
const polling = cancellablePoll(
  () => Math.random(),
  val => val > 0.9,
  100,
  5000
);

// 可以调用 polling.cancel() 提前终止
setTimeout(() => polling.cancel(), 2000);

polling.then(val => {
  console.log('Got value:', val);
}).catch(err => {
  console.error('Polling failed:', err);
});

注意事项

轮询间隔不宜过短,避免性能问题 超时时间应根据实际需求合理设置 对于DOM操作,考虑使用 MutationObserver 替代轮询更高效 取消功能对于长时间运行的任务很有必要

标签: 函数js
分享给朋友:

相关文章

js实现倒计时

js实现倒计时

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

js实现搜索

js实现搜索

实现搜索功能的方法 在JavaScript中实现搜索功能可以通过多种方式完成,以下是几种常见的实现方法。 使用数组的filter方法 通过数组的filter方法可以筛选出符合条件的数据项。假设有一个…

js实现定位

js实现定位

使用Geolocation API获取当前位置 在JavaScript中,可以通过浏览器内置的Geolocation API获取用户的地理位置信息。该API需要用户授权才能访问位置数据。 if (n…

实现继承js

实现继承js

实现继承的方式 在JavaScript中,实现继承可以通过多种方式完成,每种方式都有其优缺点。以下是几种常见的实现继承的方法: 原型链继承 原型链继承是最基本的继承方式,通过将子类的原型指向父类的实…

js 实现按钮点击

js 实现按钮点击

实现按钮点击的 JavaScript 方法 HTML 按钮元素 在 HTML 中创建一个按钮,可以通过 <button> 或 <input> 标签实现: <button…

js实现刷新页面

js实现刷新页面

刷新页面的方法 在JavaScript中,可以通过多种方式实现页面刷新。以下是几种常见的方法: 使用 location.reload() 调用 location.reload() 方法可以重新加载当…