处理错误基本实现

网络异常onerror

  1. request.onerror = err => {
  2. reject(new Error('Networe Error'))
  3. }

请求超时ontimeout

  1. request.ontimeout = (err) => {
  2. reject(new Error(`Timeout of ${timeout}ms exceeded`))
  3. }

:::warning 注意: 需要在 onreadystatecchange里判断status===0,否则会执行handleResponse方法先,从而调用了resolve(response) :::

非200状态码

  1. function handleResponse(response: AxiosResponse) {
  2. if (response.status >= 200 || response.status <= 300) {
  3. resolve(response)
  4. } else {
  5. reject(`request failed with status ${response.status}`)
  6. }
  7. }

错误信息增强

创建 AxiosError

Object.setPrototypeOf(this, AxiosError.prototype) 是为了: 处理ts继承内置对象,找不到原型方法的问题

  1. export class AxiosError extends Error {
  2. isAxiosError: boolean;
  3. request?: any;
  4. response?: AxiosResponse;
  5. code?: string;
  6. config: AxiosRequestConfig;
  7. constructor(
  8. message: string,
  9. config: AxiosRequestConfig,
  10. code?: string,
  11. request?: any,
  12. responese?: AxiosResponse,
  13. ) {
  14. super(message)
  15. this.isAxiosError = true
  16. this.config = config
  17. this.code = code
  18. this.request = request
  19. this.response = responese
  20. // https://github.com/microsoft/TypeScript-wiki/blob/main/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work
  21. Object.setPrototypeOf(this, AxiosError.prototype)
  22. }
  23. }
  24. // 定义工厂函数
  25. export function createError(
  26. message: string,
  27. config: AxiosRequestConfig,
  28. code?: string,
  29. request?: any,
  30. responese?: AxiosResponse,
  31. ) {
  32. return new AxiosError(
  33. message,
  34. config,
  35. code,
  36. request,
  37. responese,
  38. )
  39. }

应用

替换所有的new Error,使用createError替换,例如:

 request.onerror = () => {
   reject(createError('Networe Error', config, null, request))
 }

 request.ontimeout = () => {
   reject(createError(`Timeout of ${timeout}ms exceeded`, config, null, request))
 }

导出所有类型定义

新建axios.ts,把之前index.ts复制进去并导出,index.ts直接使用axios。
并且通过export * from './types/index' 导出所有类型定义

import axios from "./axios";

export default axios
// 导出所有类型定义
export * from './types/index'