js使用Promise实现简单的Ajax缓存
业务场景
在不少业务场景下,我们需要实现简单的请求缓存(即某个请求只发起一次请求),例如上传Token的获取、获取配置的接口等。
这些接口可以通过Promise实现简单的缓存并能够控制更新,而不需要另外引入缓存层。
示范代码
用七牛上传作例子,一般我们会把七牛上传封装为一个单独的Upload组件,外部只需要调用组件,而token的获取封装到组件内部实现。
//Upload.vue
letfetchToken=null;
exportdefault{
data(){
return{
token:''
};
},
methods:{
asyncupload(){
try{
//...
}
catch(err){
alert(err.message);
this.refreshToken();
}
},
refreshToken(){
fetchToken=null;
this.fetchToken();
},
fetchToken(){
if(!fetchToken){
fetchToken=request.get('/api/qiniu/token');
}
try{
this.token=awaitfetchToken;
}
catch(err){
console.error(err);
}
}
},
created(){
this.fetchToken();
}
};
上面是一个简单的缓存上传token的例子,并且会在上传失败时刷新token。
与直接缓存Token的值比较,缓存请求有什么好处?
//缓存值的代码
exportdefault{
methods:{
fetchToken(){
if(!fetchToken){
fetchToken=awaitrequest.get('/api/qiniu/token');
}
try{
this.token=fetchToken;
}
catch(err){
console.error(err);
}
}
}
}
一个比较常见的Upload组件的应用场景,在一个页面里同时使用多次该组件。
就上面的代码例子,如果使用缓存值的方法,那么页面一打开就会请求两次获取Token接口。
继续完善Upload组件
//Upload.vue
letfetchToken=null;
exportdefault{
methods:{
asyncupload(){
try{
this.fetchToken();
consttoken=awaitfetchToken;
//...
}catch(err){
alert(err.message);
this.refreshToken();
}
},
refreshToken(){
fetchToken=null;
this.fetchToken();
},
fetchToken(){
if(!fetchToken){
fetchToken=request.get('/api/qiniu/token');
}
}
},
created(){
this.fetchToken();
}
};
为了防止多个Upload组件token不同步问题,不再通过this.token保存token,而是每次都等待fetchTokenresolved,保证获取到的token一定是最新的。
当然,这里还有很多需要优化,例如失败后的重试、判断是401失败才刷新token、设置错误时间、定时刷新等等,但总体思路就是上面代码所展示的内容。
另外再介绍一个经典应用场景
constfetchConfig=(()=>{
letconfigRequest=null;
return()=>{
if(!configRequest){
configRequest=Promise.all([services.customer.config1,services.customer.config2])
.then(([data1,data2])=>{
return{data1,data2};
})
.catch(err=>{
configRequest=null;
returnPromise.reject(err);
});
}
returnconfigRequest;
};
})();
exportdefault{
asyncbeforeRouteEnter(to,from,next){
try{
//配置信息仅需要成功请求一次
const[data,config]=awaitPromise.all([services.customer.getInfo(),fetchConfig()]);
next(vm=>{
vm.data=data;
vm.config=config;
vm.init();
};
}catch(err){
next(err);
}
}
};
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。