基本概念
实现
轮询同步请求
async getObj(css: string) {
let delay = 100;
let count = 0;
return new Promise(resolve => {
let id = window.setInterval(() => {
count += delay;
let obj = document.querySelector(css);//非异步目标
if (obj || count >= 1000) {
window.clearInterval(id);
resolve(obj)
}
}, delay)
})
}
轮询异步请求
- child::
轮询异步请求
较好的方案
- 使用链式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 自用轮子 轮询钩子
指向原始笔记的链接