..
点击公众关注号,“技术干货”及时达!前言❝场景:我们进入某应用项目某页面,同时调用多个接口,此时,我们需要请求token,如果我们使用的是axios来请求,我们一般会在请求拦截器里进行处理,大致是如何检查到本地缓存不存在 token,说明是...
A股板块轮动加剧,跨年大妖来袭,这几只票主力已明显介入!微信搜索关注【研讯小组】公众号(可长按复制),回复666,领取代码!
❝场景:我们进入某应用项目某页面,同时调用多个接口,此时,我们需要请求token,如果我们使用的是axios来请求,我们一般会在请求拦截器里进行处理,大致是如何检查到本地缓存不存在 token,说明是第一次进入应用,还没请求token并缓存下到本地,与此同时调用多个接口,也就会触发请求token的接口多次,而我们理想的方案是多个接口使用的是均是第一次请求的token,后续接口使用的也是第一次缓存的token,那么我们如何操作才能达实现呢?
❞
❝我们需要编写一个 「重复触发多次,只返回第一次请求的结果」 函数
❞
functionrepeatOnce(getResult,local_name){
returnnewPromise(async(resolve)=>{
constlocal_result=localStorage.getItem(local_name)
if(local_result){
console.log('%c[存在]-1166','font-size:13px;background:pink;color:#bf2c9f;',)
resolve(local_result)
}else{
if(!repeatOnce.count){
repeatOnce.count=0
repeatOnce.count++
console.log('%c[刚进入应用页面,缓存结果不存在,需要请求并缓存到本地]-1169','font-size:13px;background:pink;color:#bf2c9f;',)
constrequest_result=awaitgetResult()
localStorage.setItem(local_name,request_result)
resolve(request_result)
repeatOnce.emitter.emit('ok',request_result)
}else{
repeatOnce.count++
console.log('%c[repeatOnce.count第'+repeatOnce.count+'次请求等待返回结果]-64','font-size:13px;background:pink;color:#bf2c9f;',repeatOnce.count)
repeatOnce.emitter.on('ok',(result)=>{
repeatOnce.count=0
resolve(result)
})
}
}
})
}
repeatOnce.emitter={
_events:{},
on(eventName,callback){
//判断是有已经有对应的事件名
if(!this._events[eventName]){
this._events[eventName]=[callback];
}else{
this._events[eventName].push(callback);
}
},
emit(eventName,...args){
this._events[eventName]?.forEach(event=>event(...args));
}
}
❝通过静态变量
❞count
来计数,来判断是否的第一个请求,是则去调用 token 接口,后续发起的请求,就全部挂起等第一次token的结果返回,返回会第一时间通知后面发起的请求,emitter
则是一个订阅和通知的对象,用它来挂起后面的请求,让等待第一个token接口返回结果 并emit
携带 token 结果进行 通知
//模拟的请求token的方法
functiongetToken(){
returnnewPromise((resolve,reject)=>{
setTimeout(()=>{
resolve('我是请求的结果数据-token')
}
,1000)
})
}
//tokenPromise
consttoken=repeatOnce.bind(null,getToken,'Access_Token')
//页面有3个方法,每个方法里面都调用了同个接口,类似token
asyncfunctionrequest1(){
constres=awaittoken()
console.log('%c[request1]-1226','font-size:13px;background:pink;color:#bf2c9f;',res)
}
asyncfunctionrequest2(){
constres=awaittoken()
console.log('%c[request2]-1226','font-size:13px;background:pink;color:#bf2c9f;',res)
}
asyncfunctionrequest3(){
constres=awaittoken()
console.log('%c[request3]-1226','font-size:13px;background:pink;color:#bf2c9f;',res)
}
//页面触发了3个接口,每个接口都请求了相同的接口,但是只会触发一次token接口,使用的token均是第一次请求的token值
request1()
request2()
request3()
❝我们项目中出现该场景的情况还是比较多的,希望对大家有用,如有疑问,欢迎留言,有更好的 idea,欢迎一起讨论,感谢
❞
A股板块轮动加剧,跨年大妖来袭,这几只票主力已明显介入!微信搜索关注【研讯小组】公众号(可长按复制),回复666,领取代码!
本站内容转载请注明来源并提供链接,数据来自互联网,仅供参考。如发现侵权行为,请联系我们删除涉嫌侵权内容。
【封装axios】前端架构让你一次封装终身受益!!!(稀土掘金技术社区2024年11月07日文章)
axios中的那些天才代码!看完我实力大涨!(稀土掘金技术社区2024年10月07日文章)
前端部署后自动提醒用户更新(稀土掘金技术社区2024年11月09日文章)
用iframe必定遇到过这六种“坑”之一(以vue为示例)(稀土掘金技术社区2024年11月05日文章)
vue3+gasp实现【星之卡比输入框】(稀土掘金技术社区2024年10月23日文章)
flex 布局中更巧妙的布局方案!比 justify-content 和 align-items 好用多了!(稀土掘金技术社区2024年10月29日文章)
2024年了,前端人是时候给予页面一点 Hero Section 魔法了!!! (Three.js)(稀土掘金技术社区2024年10月05日文章)
发现一个程序员最强外设,助你高效开发早日摸鱼!(稀土掘金技术社区2024年09月24日文章)
源码视角,Vue3为什么推荐使用ref而不是reactive(稀土掘金技术社区2024年07月31日文章)
前端开发,vue3实现excel文件预览和打印(稀土掘金技术社区2024年08月05日文章)
版权投诉请发邮件到1191009458#qq.com(把#改成@),我们会尽快处理
Copyright©2023-2024众股360(www.zgu360.com).AllReserved|备案号:湘ICP备2023009521号-3
本站资源均收集整理于互联网,其著作权归原作者所有,如有侵犯你的版权,请来信告知,我们将及时下架删除相应资源
Copyright © 2024-2024 EYOUCMS. 易优CMS 版权所有 Powered by EyouCms