js实现poll函数

实现 Poll 函数的方法
在 JavaScript 中,poll 函数通常用于定期检查某个条件是否满足,直到条件为真或超时。以下是几种实现方法:
使用 setTimeout 递归
function poll(fn, condition, interval, timeout) {
const endTime = Date.now() + timeout;
const check = () => {
fn().then(result => {
if (condition(result)) {
return result;
} else if (Date.now() < endTime) {
setTimeout(check, interval);
} else {
throw new Error('Polling timed out');
}
}).catch(err => {
throw err;
});
};
return check();
}
使用 async/await 和 setInterval
async function poll(fn, condition, interval, timeout) {
const endTime = Date.now() + timeout;
return new Promise((resolve, reject) => {
const timer = setInterval(async () => {
try {
const result = await fn();
if (condition(result)) {
clearInterval(timer);
resolve(result);
} else if (Date.now() >= endTime) {
clearInterval(timer);
reject(new Error('Polling timed out'));
}
} catch (err) {
clearInterval(timer);
reject(err);
}
}, interval);
});
}
使用方法示例
// 模拟一个异步函数
function fetchData() {
return new Promise(resolve => {
setTimeout(() => {
resolve(Math.random() > 0.5);
}, 1000);
});
}
// 调用 poll 函数
poll(
fetchData,
result => result === true, // 条件:返回 true 时停止
1000, // 每隔 1 秒检查一次
5000 // 超时时间 5 秒
).then(result => {
console.log('Polling succeeded:', result);
}).catch(err => {
console.error('Polling failed:', err);
});
注意事项
fn必须是一个返回 Promise 的函数。condition是一个回调函数,用于检查结果是否符合预期。interval是每次检查的时间间隔。timeout是整个轮询的超时时间。
这些方法可以根据具体需求进行调整,例如添加重试次数限制或自定义错误处理逻辑。







