TS重构axios——处理请求错误

处理网路异常错误

XMLHttpRequest.status

只读属性 XMLHttpRequest.status 返回了XMLHttpRequest 响应中的数字状态码。

status 的值是一个无符号短整型。在请求完成前,status的值为0

值得注意的是,如果 XMLHttpRequest 出错,浏览器返回的 status 也为0。

网络错误问题

request.onerror = function handleError () {
    reject(new Error('Network Error'))
}

请求超时问题

  1. 设定最长请求时间

    if(timeout) {
        request.timeout = timeout
    }
    
  2. 处理超时问题

    // 请求超时问题
    request.ontimeout = function handleTimeout () {
        reject(new Error(`Time out of ${timeout} ms exceeded`))
    }
    

处理其他异常问题

function handleResponse(response : AxiosResponse) : void{
    if(response.status >= 200 && response.status < 300) {
        resolve(response)
    } else {
        reject(new Error(`Request failed with status code ${response.status}`))
    }
}

在监听请求状态的函数中添加

        // 监听请求状态
        request.onreadystatechange = function handleLoad () {
            if (request.readyState !== 4) {
                return
            }
            // 请求为完成或者出错
            if (request.status === 0) {
                return
            }
            // 获取response的Headers
            const responseHeaders = paresHeaders(request.getAllResponseHeaders())
            // 获取response的data
            const responseData =  responseType !== 'text' ? request.response : request.responseText
            
            const response:AxiosResponse = {
                 data:responseData,
                 status:request.status,
                 statusText:request.statusText,
                 headers:responseHeaders,
                 config,
                 request
            }
            handleResponse(response)
        }

优化错误处理

效果:如果出现错误,将返回错误信息、请求的参数以及code,方便对错误进行处理

我们将通过创建AxiosError类进行处理

创建接口

export interface AxiosError extends Error {
    isAxiosError: boolean,
    config: AxiosRequestConfig,
    code?: number | string,
    request?: any,
    response?: AxiosResponse
}

创建对象

import { AxiosRequestConfig, AxiosResponse } from './../types/index';
export class AxiosError extends Error {
    isAxiosError:boolean
    config:AxiosRequestConfig
    code?:string | number
    request?:any
    response?:AxiosResponse

    constructor(
        message:string,
        config:AxiosRequestConfig,
        code?:string | number,
        request?:any,
        response?:AxiosResponse

    ){
        super(message)
        
        this.config = config
        this.code = code
        this.request = request
        this.response = response
        this.isAxiosError = true

        // 解决ts的问题,在继承Error、Map、Array的时候需要添加
        Object.setPrototypeOf(this, AxiosError.prototype)
    }
}

export function createError(
    message:string,
    config:AxiosRequestConfig,
    code?:string | number,
    request?:any,
    response?:AxiosResponse
){
    const error = new AxiosError(message,config,code,request,response)
    return error
}
Vue 3 + TypeScript 使用 Axios 进行网络请求的步骤如下: 1. 安装 Axios 库:在项目中安装 Axios 库,可以使用命令 `npm install axios --save` 或者 `yarn add axios`。 2. 创建 TypeScript 类型:定义 Axios 返回数据的类型,例如: ```typescript interface ResponseData { code: number; message: string; data: any; } ``` 3. 创建 Axios 实例:在 Vue 组件中创建 Axios 实例,例如: ```typescript import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'; import { ResponseData } from './types'; class ApiService { private readonly axiosInstance: AxiosInstance; constructor() { this.axiosInstance = axios.create({ baseURL: 'https://example.com/api', }); } async get<T>(url: string, config?: AxiosRequestConfig): Promise<T> { const response: AxiosResponse<ResponseData<T>> = await this.axiosInstance.get<ResponseData<T>>(url, config); return response.data.data; } async post<T>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> { const response: AxiosResponse<ResponseData<T>> = await this.axiosInstance.post<ResponseData<T>>(url, data, config); return response.data.data; } } export default new ApiService(); ``` 4. 使用 Axios 实例:在 Vue 组件中使用 Axios 实例进行网络请求,例如: ```typescript import { defineComponent, ref } from 'vue'; import ApiService from './apiService'; import { User } from './types'; export default defineComponent({ setup() { const users = ref<User[]>([]); const fetchUsers = async () => { users.value = await ApiService.get<User[]>('/users'); }; return { users, fetchUsers, }; }, }); ``` 相关问题: 1. 什么是 TypeScript? 2. 什么是 Axios? 3. 如何在 Vue 中使用 Axios 发送网络请求? 4. 如何处理 Axios 返回的数据?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值