Axios-防止.then()对HTTP错误执行

时间:2018-11-19 09:42:10

标签: javascript promise axios interceptor

我的问题:

我已经设置了一个拦截器来捕获HTTP响应中的错误代码。 当JWT到期时,我从服务器返回了代码401。这是我的拦截器:

this.axios.interceptors.response.use(undefined, (error) => {
  if (error.response.status === 401) {
    this.$store.dispatch('auth/logout').then(() => {
      this.$router.push({name: 'login'})
      return Promise.reject(error)
    })
  }
})

我的拦截器工作正常,除了被拦截的请求仍然解析为.then()部分。

this.axios.get('/texts').then(function(){
    // This is still being executed and generates javascript errors because the response doesn't contain the right data
})

从axios文档中,我发现您可以通过调用

来防止这种情况
this.axios.get('/texts').then(function(){
    // only on success
}).catch(function(){
    // only on errors
}).then(function(){
    // always executed
})

但这很冗长,我不想在我的应用发出的每个请求中都这样做。

我的问题是:

出现错误时,如何防止axios执行.then()回调。我可以在拦截器中做些什么吗?像event.stopPropagation()之类的东西?

3 个答案:

答案 0 :(得分:1)

您可以使用以下代码集来防止 Axios 错误

this.axios.interceptors.response.use(undefined, (error) => {
  if (error.response.status === 401) {
    this.$store.dispatch('auth/logout').then(() => {
      this.$router.push({name: 'login'})
      return new Promise(() => { });
    })
  } else {
    return Promise.reject(error)
  }
})

答案 1 :(得分:0)

您是否在链末尾尝试了catch?您将得到关注

this.axios.get('/texts').then(function(){
    // only on success
}).then(function(){
    // only on success in previous then 
}).catch(function(){
    // executes on every error from `get` and from two previous `then`
})

答案 2 :(得分:0)

从catch块抛出异常以防止'then'块

this.axios.get('/texts').then(function(){
    // only on success
}).catch(function(e){
    // only on errors
    throw e; 
}).then(function(){
    // Will not executed if there is an error but yes on success
})