js 轮询方法

很多时候我们会遇到使用轮询方法去处理一些逻辑,比如说扫码后轮询判断二维码是否被使用等情况。
以下是一个基于 JavaScript 编写的一个简单轮询方法:
poll.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 轮询方法
function pollCode(fn, interval, timeout) {
var endTime = Number(new Date()) + (timeout || 600000);
interval = interval || 1000;
var checkCondition = function (resolve, reject) {
// 如果超时则停止轮询
if (Number(new Date()) > endTime) {
reject(new Error("轮询超时"));
// 如果条件满足则停止轮询
} else if (fn()) {
resolve();
// 否则继续轮询
} else {
setTimeout(checkCondition, interval, resolve, reject);
}
};
return new Promise(checkCondition);
}
  • 方法调用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
pollCode (function() {
// 这里是你要轮询的条件判断
// 返回 true 表示条件满足,停止轮询
// 返回 false 表示条件未满足,继续轮询
console.log('正在轮询...');
return Math.random() < 0.1; // 示例条件:随机小于 0.1 时停止轮询
}, 2000, 10000) // 每隔2秒轮询一次,总共轮询10秒
.then(function() {
console.log('轮询成功');
})
.catch(function(error) {
console.error('轮询失败:', error);
});

  • 参数解说
    fn:一个函数,用于执行需要轮询的条件判断。如果条件满足则返回 true,否则返回 false。
    interval:可选参数,表示轮询间隔的毫秒数,默认为 1000 毫秒。
    timeout:可选参数,表示轮询超时的毫秒数,默认为 2000 毫秒。
    在上述方法中,pollCode () 方法会每隔一定的时间(由 interval 参数指定)执行一次条件判断函数 fn,直到条件满足或者超过指定的超时时间(由 timeout 参数指定)为止。当条件满足时,返回一个 Promise 对象,then() 方法中的回调函数会被调用;如果超时未满足条件,则会抛出一个超时错误并进入 catch() 中的回调函数。