轮询:就是定时重复请求一个接口,比如,我们想要知道一个订单的状态,就需要轮训订单状态的接口,查询到我们想要的结果 (支付成功或者失败) 就终止轮询。
方法一:setInterval
这个方法我们一般都能想到,用法很简单,但是这种方法,如果我们忘记了清空定时器就会导致内内存栈溢出。
function checkOrderStatus() {
console.log(1);
}
const timer = setInterval(() => {
checkOrderStatus()
}, 1000)
// 退出的时候一定要清空
clearInterval(timer)
方法二:setTimeout + 递归
所以我们还可以使用setTimeout进行轮询,可以省掉清空定时器的步骤,特别适合异步请求中,在请求返回之后,重新设置setTimeout定时即可
function checking() {
setTimeout(() => {
// 假设 checkOrderStatus是一个异步函数
checkOrderStatus().then((res) => {
// 满足条件停止递归
if (res) {
//
} else {
checking()
}
})
}, 3000);
}
方法三:使用requestAnimationFrame模拟定时器
请参考我的这篇文章