# 错误重传

错误重传是对返回表示错误的HTTP响应码的请求进行重新发送。对于一般错误(比如普通的Promise.reject)不予处理。

# 自动重传

import AxiosSugar from 'axios-sugar';

AxiosSugar.defaults = {
  retry: {
    enable: true,
    auto: true
  }
};

这样,错误的请求就会自动重新发送了。

注意

由于该功能依赖axios返回的错误中的response.status,所以应尽量避免使用axios的transformResponse, 因为这可能导致status的缺失而出错。如果一定要使用,一定要保证response.status字段的存在。

提示

可以使用interceptors取代transformResponse,这样HTTP响应码已经处理过了,不再需要response.status

import AxiosSugar from 'axios-sugar';

AxiosSugar.interceptors.response.use(() => {

}, () => {
  // 改变错误时,response的值
})

当然,更好地做法是统一使用HTTP响应状态码处理器处理:

import AxiosSugar from 'axios-sugar';

// 设置对状态码200的处理
AxiosSugar.httpStatusProcessor.setStatusHandler('200', function (
  status, payload, result, retry
) {
  // 没设置其它和200状态码相关的处理函数时,result的值等于response
  return result.data;
});

# 重传次数

默认只会尝试重传3次,可以通过count字段来设置。

{
  retry: {
    enable: true,
    count: 3,
    delay: 1000 // 1秒后再次尝试
  }
}

重传的过程中,相关事件会被触发。

import AxiosSugar from 'axios-sugar';

// 每次重传后
AxioSugar.on('retried', function (err) {
  console.log(`${err.count}次重新发送!`);
});

// 完成失败后
AxiosSugar.on('retryFailed', function (err) {
  console.log(`错误重传失败!`);
});

# 手动重传

手动重传需要借助HTTP响应状态码处理器来实现

import AxiosSugar from 'axios-sugar';

// status是状态码
// payload是响应(成功结果或者错误)
// result是response,如果payload是错误,则为undefined
AxiosSugar.httpStatusProcessor.on('statusAfter', function (
  status, payload, result, retry
) {
  // 如果status不是2XX,就重传
  if (status > 300 || status < 200) {
    retry();
  }
});