较好的方案
- 使用链式setTimeout()而不是setInterval,保证上一个请求结束后才能执行下一个请求
- 图示:

- 如果请求参数可能有变更
- 则在每次请求响应后判断参数是否有变更([use::js判断对象相同]),如果有变更就不再继续下一次setTimeout(),并且抛弃当前相应的结果
- 参数变更时触发新的setTimeout()
- 代码示例:
let currentParams={};
function pollAsyncRequest(params) {
let data await = getData(params)
// 判断参数是否有变更
if (JSON.stringify(currentParams) !== JSON.stringify(params)) {
// 不触发下一次轮询
} else {
console.log('参数没有变更,继续下一次轮询');
setTimeout(() => pollAsyncRequest(params), 1000);
}
}
// 启动轮询异步请求
pollAsyncRequest(params);
function updatePoll(){
currentParams = {}//设置新的参数
pollAsyncRequest(currentParams)
}
- 如果轮询需要暂停和继续
- 暂停时清除现在的计时器,继续时新的计数器
- 请求响应后判断是否已暂停,暂停就不继续下一次计时了
- child::react 自用轮子 轮询钩子