0.1.5 • Published 1 year ago

axios-assist v0.1.5

Weekly downloads
-
License
ISC
Repository
github
Last release
1 year ago

axios 节流 无感刷新 AbortController signal 无感刷新token cancelToken assist

如何在根本解决重复提交请求

如何在根本上解决输入框行为结束后发送请求获取争取的数据

example code

  • 你可以使用 defineAbortSignalThrottle;
import axios, { CreateAxiosDefaults } from 'axios';
import {
    defineAbortSignalThrottle,
    defineRefreshToken,
    type CAxiosInstance,
    type CAxiosResponse,
    type CInternalAxiosRequestConfig
} from 'axios-assist';

export function defineXhrRequest(axiosDefaults: CreateAxiosDefaults = {}) {
    const instance = axios.create(Object.assign({
        timeout: 10000,
    }, axiosDefaults)) as CAxiosInstance;

    /**
     * 定义一个终止器
     * @params mcq 最大的并发数量
     * @params 
     */
    const { abortSignalSetup } = defineAbortSignalThrottle({ mcq: 1 });
    // 设置终止器
    abortSignalSetup(instance);

    // 添加请求拦截器
    instance.interceptors.request.use(function (config: CInternalAxiosRequestConfig) {
        return config;
    }, function (error) {
        return Promise.reject(error);
    });

    // 添加响应拦截器
    instance.interceptors.response.use(function (response: CAxiosResponse) {
           // silent 静默
        if (response?.config?.silent) {
            return Promise.resolve(response);
        }
        return Promise.resolve(response?.data);
    }, function (error) {
        return Promise.reject(error);
    });
    return instance;
}
  • 精细控制
export function testHttp(params = {}) {
    const abortC = new AbortController();
    return xhrRequest.get('/xxxxx', {
       
        params: params,
        /**
        * 自定义终止器
        * 默认undefined 
        * @default undefined;
        */
        signal: abortC.signal,
         /**
        * 自定义添加控制接口是否静默
        * 默认undefined 不静默、根据具体逻辑弹出提示
        * @default undefined;
        */
        silent: true,
        /**
         * 自定义添加控制接口请求是否节流
         * 默认undefined 开启节流
         * @default undefined;
        */
        throttle: true,
        /**
         * 最大的并发数量
         * @default undefined;
         */
        maxConcurrentQueryCount: 1, // 最大的并发请求次数
    });
}

无感刷新token

  • 你可以使用 defineRefreshToken;
import axios, { CreateAxiosDefaults } from 'axios';
import {
    defineRefreshToken,
    type CAxiosInstance,
    type CAxiosResponse,
    type CInternalAxiosRequestConfig
} from 'axios-assist';

export function defineXhrRequest(axiosDefaults: CreateAxiosDefaults = {}) {

    const instance = axios.create(Object.assign({
        timeout: 10000,
    }, axiosDefaults)) as CAxiosInstance;;

    const { refreshTokenSetup } = defineRefreshToken({
        refreshRequestCount: 1, // 允许 refresh request count
        request: instance,
        refreshRequest: async () => {
            const resp: any = await async () => {
                // 在这里处理获取最新token
                return true;
            };
            if (resp) {
                // 返回通过即开始重新发送待刷新的请求
                return Promise.resolve(true);
            }
            return Promise.reject(false);
        },
        isRefresh: (response) => {
            // 这里控制是否刷新token
            return response?.status === 401 || response?.data?.code === 401;
        },
    });

    /**
     * 注册刷新token器
     * @param instance 请求的实例、选传,不传即共用 defineRefreshToken 传入的 request
     */
    refreshTokenSetup(instance);

    // 添加响应拦截器
    instance.interceptors.response.use(function (response: CAxiosResponse) {
        // 使用了刷新token 并且刷新失败 refreshRequestCount为 0
        if (!response.config?.refreshRequestCount) {
           alert('登录授权失效、重新登录后重试');
        }
        return Promise.resolve(response?.data);
    }, function (error) {
        return Promise.reject(error);
    });
    return instance;
}
  • 精细控制
export function testHttp(params = {}) {
    const abortC = new AbortController();
    return xhrRequest.get('/xxxxx', {
        params: params,
        /**
        * 刷新token 的次数
        * 默认undefined 
        * @default undefined;
        */
        refreshRequestCount: 1,
    });
}
0.1.2

1 year ago

0.1.4

1 year ago

0.1.3

1 year ago

0.1.5

1 year ago

0.1.1

1 year ago

0.1.0

1 year ago