捕获承诺后传递错误

时间:2017-10-27 16:27:45

标签: javascript promise vuejs2 axios

嗨,我很抱歉,如果我的问题没有正确表达,那就很抱歉。

我想在全局函数中定义axios js的承诺。 在这里,我想要全局处理/捕获401状态并注销用户。 我不想在每个查询中处理它。

这是我处理请求的源全局函数:

export function requestData (url, payload = {}) {
  return axios.post(url, payload)
    .then(response => {
      return response.data
    })
    .catch(error => {
      if (error.response.status === 401) {
        logout()
      } else {
        return error
      }
    })
}

这是我在控制器上使用的一个示例函数:

requestData('/api/persons', {options: this.options, search: search})
  .then(data => {
    this.data = data
  })
  .catch(error => {
    this.error = error.toString()
  })

我的问题是,当出现异常时,控制器中的promise catch不会触发。怎么实现这个?

3 个答案:

答案 0 :(得分:3)

return error功能中的requestData更改为throw error

答案 1 :(得分:1)

根据Axios docs

  

您可以在处理请求或响应之前拦截它们或捕获它们。

您将要使用Response Interceptor:

axios.interceptors.response.use(function(response) {
  // Do something with response data
  return response;
}, function(error) {
  // Do something with response error
  if (error.status === 401) {
    logout()
  }
  return Promise.reject(error);
});

答案 2 :(得分:0)

return error替换throw error是一半的工作 当我正确时,promise中的throw error catch将不会调用下一个promise .catch语句。这将在.then语句中起作用。

这样它应该有效:

export function requestData (url, payload = {}) {
  return axios.post(url, payload)
    .then(response => {
      return response.data
    })
    .catch(error => {
      if (error.response.status === 401) {
        logout()
      } else {
        return error
      }
    })
   .then(result => {
      if (result instanceof Error) {
        throw result
      } else {
        return result
      }
    })
}