首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Axios:如何拦截和响应axios请求

Axios:如何拦截和响应axios请求
EN

Stack Overflow用户
提问于 2020-07-01 22:32:55
回答 2查看 2.8K关注 0票数 5

在axios请求被发送之前,是否有一种方法不仅可以拦截,而且还可以响应它?同样,从浏览器发送请求并从浏览器响应它+阻止它发送请求。

我知道我可以使用axios interceptors在请求和响应被发送并返回到组件之前拦截它,并且我知道在请求拦截器中,我可以抛出一个错误并用一个失败的请求触发响应拦截器。对于成功的请求,我如何做同样的事情呢?在某些条件下,我希望axios响应,就像它传递给服务器一样,而实际上它从未经过拦截器。这个是可能的吗?

下面是我到目前为止所得到的伪代码:

代码语言:javascript
复制
      axios.interceptors.request.use(
      request => {
        if (localResponse) {
              throw { isLocal: true, data: { hello: 'world' } }; // <- this will stop request and trigger 
                                                                 // response error. I want to trigger 
                                                                 // the actual response callback
        } else {
            return request;   // <- will perform full request
        }
      },
      error => {
        return Promise.reject(error);
      }
    );

    axios.interceptors.response.use(
      response => {
        return response; // <- I want to trigger this callback
      },
      error => { // <- so far i can only trigger a response error
        if (error?.isLocal) { 
          return Promise.resolve(error.data); 
        }
        
        return Promise.reject(error);
      }
    );

我已经尝试过解析请求拦截器,但它试图继续满足请求。有没有人有创造性的想法来解决这个问题?也许还有比使用拦截器更好的解决方案?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-01 23:24:40

自己想出了一个解决方案。这样,我所有的axios调用都不会被改变,我只需要改变拦截器的行为。

注意:如果有人想出了更好的解决方案,我会很高兴地将他们的答案标记为正确和向上的投票。就目前而言,这是我能想到的最好的解决方案。

溶液

下面是我解决这个问题的方法

代码语言:javascript
复制
      axios.interceptors.request.use(
      request => {
        if (localResponse) {
              throw { isLocal: true, data: { hello: 'world' } }; // <- this will stop request and trigger 
                                                                 // response error. I want to trigger 
                                                                 // the actual response callback
        } else {
            return request;   // <- will perform full request
        }
      },
      error => {
        return error?.isLocal 
                    ? Promise.resolve(error); // <- triggers response intercept
                    : Promise.reject(error);
      }
    );

    axios.interceptors.response.use(
      response => {
        return response; 
      },
      error => {
          error?.isLocal 
                ? Promise.resolve(error); // <- sends as successful response
                : Promise.reject(error);
      }
    );

本质上,我所做的是抛出一个错误,以防止请求通过,但随后解决错误而不是拒绝它。有点烦人,但它能把工作做完。

票数 6
EN

Stack Overflow用户

发布于 2020-07-01 22:40:08

在本地场景中,您可以跳过请求吗?

代码语言:javascript
复制
function getData() {
  if (localResponse) {
    return Promise.resolve({ isLocal: true, data: { hello: 'world' }});
  }
  else {
    return axios.whatever;
  }
}
...
getData().then(...)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62686283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档