关于使用axios请求的一些思考
在vue项目中使用了axios请求数据的一些问题
1.axios异步请求省去了ajax封装很多麻烦,简单好用,并且可以使用拦截器(感觉用处不大),
下面是拦截器的写法
// Add a request interceptor axios.interceptors.request.use(function (config) { // Do something before request is sent return config; }, function (error) { // Do something with request error return Promise.reject(error); }); // Add a response interceptor axios.interceptors.response.use(function (response) { // Do something with response data
if(res.data.code === -1){
location.href= url + location.href;//code === -1 跳转到buc登录
}
//return; return response; }, function (error) { // Do something with response error return Promise.reject(error); });
由于用户登录情况,系统维护状态,正常情况后端返回的数据不同,拦截器里的return response; 改为return;组件的axios仍然执行,1.2情况仍报错
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。//1.请求的数据中,可能没有登录,后台返回 数据如下
{ code:-1, url: "https://login.xxxx.com/ssoLogin.htm?APP_NAME=auto-ci&BACK_URL=", }
//2.维护下 { maintenance:true, message:'系统维护中', timestamp:1231231//返回数据的事件戳 }
//3.登录的数据如下
{
success:true,
data:{},
timestamp:1231231,//返回数据的事件戳
}
但是情况1,2不符合每个组件返回数据response的数据格式,就会error,报 error res.data is not defined
我设置了如果error 就会用element-ui的message弹信息条,这就导致了每次登录前就会弹一次error信息。客户认为平台出了问题就向开发提出问题。
这样在每一个请求里判断数据就很麻烦
需要集中处理下
function get(url,callback){ return new Promise((resolve,inject)=>{ axios.get(url) .then(res=>{ if(res.data.code == -1){ location.href = res.data.href + location.href; return; }else if(res.data.maintenance){ callback(res.data); return; } resolve(res.data); }) .catch(err=>{ inject(err.message) }) }) }
维护
get('url',res=>{
console.log(res,'callback')//维护下 不使用 promise 直接回调callback
})
正常情况
get('http://localhost:3000/') .then(res=>{ console.log(res,'res') }) .catch(error=>{ console.log(error) })
然后解决问题,

更多精彩