<>强业务场景
强>
在不少业务场景下,我们需要实现简单的请求缓存(即某个请求只发起一次请求),例如上传牌的获取,获取配置的接口等。
这些接口可以通过承诺实现简单的缓存并能够控制更新,而不需要另外引入缓存层。
<强>示范代码
强>
用七牛上传作例子,一般我们会把七牛上传封装为一个单独的上传组件,外部只需要调用组件,而令牌的获取封装到组件内部实现。
//Upload.vue 让fetchToken=零; 出口默认{ 数据(){ 返回{ 令牌:“ }; }, 方法:{ 异步上传(){ 尝试{//? } 抓住(err) { 警报(err.message); this.refreshToken (); } }, refreshToken () { fetchToken=零; this.fetchToken (); }, fetchToken () { 如果(! fetchToken) { fetchToken=request.get ('/api/qiniu/令牌'); } 尝试{ 这一点。令牌=等待fetchToken; } 抓住(err) { console.error(错); } } }, 创建(){ this.fetchToken (); } }; >之前上面是一个简单的缓存上传牌的例子,并且会在上传失败时刷新令牌。
<强>与直接缓存令牌的值比较,缓存请求有什么好处? 强>
//缓存值的代码 出口默认{ 方法:{ fetchToken () { 如果(! fetchToken) { fetchToken=等待request.get ('/api/qiniu/令牌'); } 尝试{ 这一点。令牌=fetchToken; } 抓住(err) { console.error(错); } } } } >之前一个比较常见的上传组件的应用场景,在一个页面里同时使用多次该组件。
& lt; template> & lt; div类=" upload1 "祝辞& lt;上传/祝辞& lt;/div> & lt; div类=" upload2 "祝辞& lt;上传/祝辞& lt;/div> & lt;/template> >之前就上面的代码例子,如果使用缓存值的方法,那么页面一打开就会请求两次获取令牌接口。
<强>继续完善上传组件强>
//Upload.vue 让fetchToken=零; 出口默认{ 方法:{ 异步上传(){ 尝试{ this.fetchToken (); const牌=等待fetchToken;//? }捕捉(err) { 警报(err.message); this.refreshToken (); } }, refreshToken () { fetchToken=零; this.fetchToken (); }, fetchToken () { 如果(! fetchToken) { fetchToken=request.get ('/api/qiniu/令牌'); } } }, 创建(){ this.fetchToken (); } }; >之前为了防止多个上传组件令牌不同步问题,不再通过这个。令牌保存牌,而是每次都等待fetchToken解决,保证获取到的令牌一定是最新的。
当然,这里还有很多需要优化,例如失败后的重试,判断是401失败才刷新令牌,设置错误时间,定时刷新等等,但总体思路就是上面代码所展示的内容。
<强>另外再介绍一个经典应用场景强>
const fetchConfig=(()=比;{ 让configRequest=零; 返回()=比;{ 如果(! configRequest) { configRequest=Promise.all ([services.customer。config1 services.customer.config2]) 不要犹豫(((data1、data2))=比;{ 返回{data1、data2}; }) .catch(呃=比;{ configRequest=零; 返回Promise.reject (err); }); } 返回configRequest; }; })(); 出口默认{ 异步beforeRouteEnter(下),从{ 尝试{//配置信息仅需要成功请求一次 常量(数据、配置)=等待Promise.all ([services.customer.getInfo (), fetchConfig ())); 下(vm=比;{ vm。数据=https://www.yisu.com/zixun/data; vm。配置=配置; vm.init (); }; }捕捉(err) { 下一个(错); } } }; >之前以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
js使用承诺实现简单的Ajax缓存