axios请求成功不执行then,axios多次请求

  axios请求成功不执行then,axios多次请求

  本文主要介绍了多次拦截器在axios中的问题解决。有需要的朋友可以借鉴一下,希望能有所帮助。祝大家进步很大,早日升职加薪。

  

目录

  问题原因解决方案

  

问题

  在打包axios的时候,我遇到了一个问题,就是每次发出请求,axios都会拦截两次响应。我很迷惑,一时想不出主意。

  代码如下:

  Http类{

  构造器(配置){

  this.axios=axios

  this . axiosinterceptor=undefined;

  //公共标头

  let defaultHeaders={

  Content-Type“:”应用程序/JSON;字符集=UTF-8 ,

  Accept: application/json ,//由header指定,得到的数据类型是JSON application/json,text/plain,*/*,

  x-终点: . 10

  }

  if(配置?标题){

  for (let i in config.headers) {

  default headers[I]=config . headers[I];

  }

  }

  axios({

  //`baseurl 将自动添加到` url 前面,除非` url 是绝对url。

  //通过设置一个baseURL,可以很容易地为axios实例的方法传递相对URL。

  baseURL: config?baseURL,

  //` URL 是用于请求的服务器URL

  网址:配置?url,

  //` method 是创建请求时使用的方法。

  方法:config?方法 get ,

  //`headers 是要发送的自定义请求标头。

  标题:{.默认标题},

  //`params `是随请求一起发送的URL参数。

  //它必须是普通对象或URLSearchParams对象

  params: config?method===get ?配置?params {} : {},

  //params serializer 是负责 params 序列化的函数。

  //(例如https://www.npmjs.com/package/qs,http://api.jquery.com/jquery.param/)

  paramsSerializer:函数(params) {

  return Qs.stringify(params,{arrayFormat:括号 })

  },

  //`data 是作为请求主体发送的数据。

  //仅适用于这些请求方法“PUT”、“POST”和“PATCH”

  //未设置transformRequest时,它必须是以下类型之一:

  //- string,plain object,ArrayBuffer,ArrayBufferView,URLSearchParams

  //-浏览器专用:表单数据、文件、Blob

  //-专用于节点:流

  数据:配置?method===post ?配置?params {} : {},

  //`timeout 指定请求超时的毫秒数(0表示无超时)

  //如果请求的通话费用超过超时,请求将被中断。

  超时:0,

  //` with credentials 指示跨域请求是否需要凭据。

  With credentials: false,如果//default为true,则生成跨域,跨域携带cookie。

  //`responsetype `表示服务器响应的数据类型,可以是数组缓冲区, blob ,文档, JSON ,文本,流

  responseType: json ,//默认值

  });

  //添加请求拦截器

  axios . interceptors . request . use((config)={

  //在发送请求之前做一些事情

  返回配置;

  },函数(错误){

  //对请求错误做些什么

  return Promise.reject(错误);

  });

  //添加响应拦截器

  axios . interceptors . response . use((RES)={

  const { status,data }=res

  //处理错误状态提示。

  let message=

  如果(状态200 状态=300) {

  //处理http错误并将其扔给业务代码

  message=this.showResState(状态)

  if (typeof res.data===string) {

  res.data={代码:状态,消息}

  }否则{

  res.data.code=状态

  res.data.message=消息

  }

  }

  返回res.data

  },函数(错误){

  //对响应错误采取措施

  return Promise.reject(错误);

  });

  }

  get(url,params={}){

  //为具有给定ID的用户创建请求

  返回新承诺((解决,拒绝)={

  this.axios.get(url,{

  参数

  }).然后(response={

  //2.如果成功,调用resolve(值)

  解决(响应);

  })。catch(错误={

  //3.如果失败,不要调用reject(reason),而是提示异常信息。

  拒绝(错误)

  //message.error(请求出错: error.message )。然后(r={ });

  }).最后(()={

  })

  });

  }

  post(url,params={}){

  返回新承诺((解决,拒绝)={

  this.axios.post(url,params)。然后(response={

  //2.如果成功,调用resolve(值)

  解决(响应);

  })。catch(错误={

  //3.如果失败,不要调用reject(reason),而是提示异常信息。

  拒绝(错误)

  //message.error(请求出错: error.message )。然后(r={ });

  }).最后(()={

  })

  });

  }

  showResState(州){

  let message=“”;

  //这里只是一些常见的例子,可以根据需要进行配置。

  开关(状态){

  案例400:

  Message=请求错误(400)

  破裂

  案例401:

  Message=未授权,请重新登录(401)

  破裂

  案例403:

  Message=拒绝访问(403)

  破裂

  案例404:

  Message=请求中的错误(404)

  破裂

  案例500:

  Message=服务器错误(500)

  破裂

  案例501:

  Message=服务未实现(501)

  破裂

  案例502:

  Message=网络错误(502)

  破裂

  案例503:

  Message=服务不可用(503)

  破裂

  默认值:

  Message=`连接错误(${state})!`

  }

  返回` ${message},请检查网络或联系网站管理员!`

  }

  //插件初始化时会传入所需的配置项。

  autoAddToken(配置){

  //在请求阶段修改config配置项并添加令牌。可以自定义特定的属性名称。

  config.headers?={}

  config . headers . authorization=local storage . token null

  返回配置

  }

  }

  导出默认Http

  可能遇到过这种问题的小伙伴一眼就能看出问题,没遇到过这种问题的可能又要遭殃了。

  

原因

  如果使用use,就像Node.js中的use一样,会不断地给axios对象添加拦截器。因为我把拦截器放在了函数中,只要执行了函数,拦截器函数就会再次添加到axios对象中。

  所以推荐的方式是把拦截器放在函数外面,但是我的需求决定了我必须把它放在函数里面。那么如何解决呢?

  

解决

  在该文件中添加唯一变量标识符let interceptor=null,并做出判断。只要拦截器存在,就不会继续添加。一些代码如下:

  如果(!this.interceptor) {

  //添加响应拦截器

  this . interceptor=axios . interceptors . response . use((RES)={

  const { status,data }=res

  //处理错误状态提示。

  let message=

  如果(状态200 状态=300) {

  //处理http错误并将其扔给业务代码

  message=this.showResState(状态)

  if (typeof res.data===string) {

  res.data={代码:状态,消息}

  }否则{

  res.data.code=状态

  res.data.message=消息

  }

  }

  返回res.data

  },函数(错误){

  //对响应错误采取措施

  return Promise.reject(错误);

  });

  }

  它不起作用。必须在类外提取拦截器,问题就解决了。

  这里只公布了一些主要代码:

  从“axios”导入axios;

  /*将拦截器放在封装类之外*/

  //添加请求拦截器

  axios . interceptors . request . use((config)={

  //发送添加令牌等认证功能的请求前做什么

  //.

  返回配置;

  },函数(错误){

  //对请求错误做些什么

  return Promise.reject(错误);

  });

  //添加响应拦截器

  axios . interceptors . response . use((RES)={

  const { status }=res

  //在发送结果之前做一些事情来处理错误状态提示。

  //.

  返回res.data

  },函数(错误){

  //对响应错误采取措施

  return Promise.reject(错误);

  });

  Http类{

  构造器(配置){

  this.axios=axios

  //这里还需要处理配置,省略代码。

  this.config=config

  }

  //获取请求

  get(url,params={},headers={}){

  //.

  }

  //发布请求

  post(url,params={},headers={}){

  //.

  }

  }

  导出默认Http

  //如果没有特殊要求,就用这一个对象。公共头可以在这里配置。如果需要多个实例,可以用这种方法创建多个实例并导出它们。

  export const Axios=new Http({

  标题:{

  x-http-token: xxx

  }

  });

  这里不描述具体方法,只描述解决问题的方法。后续会针对axios类的封装写一篇单独的文章,详细讲解。

  以上是解决axios拦截器多执行问题的详细内容。关于axios拦截器多重执行的更多信息,请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: