项目的需要是下拉到一定程度时,根据已加载的最后一条新闻的order拼接新的url地址来获取数据,
如果下拉多次会发生请求多次数据的问题(使用了节流,但作用即小),在网上查了一些axios拦截器的配置并实际应用,但发现无法拦截?
拦截器的配置:
let pending = []; //声明一个数组用于存储每个请求的取消函数和axios标识
let cancelToken = axios.CancelToken;
let removePending = (config) => {
for(let i in pending){
if(pending[i].url === config.url) { //当当前请求在数组中存在时执行函数体
pending[i].f('cancel'); //执行取消操作
pending.splice(i, 1);
console.log('cancel');
}
}
}
axios.interceptors.request.use(config => {
removePending(config); //在一个axios发送前执行一下判定操作,在removePending中执行取消操作
config.cancelToken = new cancelToken(function executor(c){//本次axios请求的配置添加cancelToken
pending.push({ url: config.url,f:c}); //将本次的url添加到pending中,因此对于某个url第一次发起的请求不会被取消,因为还没有配置取消函数
});
return Promise.resolve(config);
}, error => {
return Promise.reject(error)
})
axios.interceptors.response.use(data => {
removePending(data.config); //在一个axios响应后再执行一下取消操作,把已经完成的请求从pending中移除
return Promise.resolve(data)
}, error => {
//加载失败
return {'data':{}}
})
axios的配置
if(scrollTop + clientH + 3800 > scrollH){
console.log('updateNow');
console.log(this.detail[19]);
axios({
url:`/${this.$route.params.routerName}?lastCursor=${this.detail[this.detail.length-1].order}&pageSize=20`
}).then(newRes=>{
console.log(newRes);
// console.log(pending);
}).catch(function(err){
console.error(err);
});
}
控制台:
想请问大佬们应该如何修改配置(;′⌒`)
可以把获取的数据写到一个本地缓存里啊,同时给这个缓存加个时间标签。 下拉刷新的时候,看看是否有缓存,缓存的时间是否超过多久,如果时间间隔太小则直接读取缓存,超过某个时间长度的话,从服务器读取数据同时再次赋值给缓存。