0.0.5 • Published 1 year ago

axios-repeat v0.0.5

Weekly downloads
4
License
MIT
Repository
github
Last release
1 year ago

axios-repeat

对重复的 axios 请求的处理,包括取消请求、锁定请求、缓存请求。

功能

  • 切换路由时,取消所有未完成的请求
  • 重复请求时,取消未完成的前请求
  • 锁定请求,防止重复提交请求
  • 缓存请求数据

安装

yarn add axios-repeat

或

npm install axios-repeat

示例

封装 axios

// http.js
import axios from 'axios';
import {
    lockableAxios,
    isRepeatSubmit,
    cancelableAxios,
    isCancel,
    cacheableAxios,
} from 'axios-repeat';

// 适配器,可以是自定义或用 axios 默认的
let adapter = axios.defaults.adapter;
// 锁定请求扩展,锁定请求完成之前不能再发起请求,用于防止重复提交请求
adapter = lockableAxios(adapter);
// 取消请求扩展,如果前一个请求没有完成,后一个请求又发起,则会取消前一个请求
adapter = cancelableAxios(adapter, {
    // 切换路由时,取消所有未完成的请求
    switchRouteCancelable: true,
});
// 缓存请求扩展,如果前一个请求已经完成,同时后一个请求和前一个请求参数相同,则可以取缓存数据
adapter = cacheableAxios(adapter, {
    // 缓存请求的过期间隔,单位毫秒,默认 2分钟(120000ms)
    cacheTimeout: 120000,
    // 获取数据之后是否需要缓存
    isNeedCache: (res) => {
        return res.success;
    },
    // 最多缓存的数据条数, 默认 50 条
    maxCahceNumber: 50,
});

const http = axios.create({ adapter });

export default function ajax(config) {
    return http({ ...config })
        .then((res) => {
            return res.data;
        })
        .catch((error) => {
            if (isCancel(error)) {
                console.log('请求已经取消');
            }
            if (isRepeatSubmit(error)) {
                console.log('请不要重复提交请求');
            }
        });
}

使用

  • 可以取消的请求
import ajax from './http.js'

// 可取消的查询请求
const queryData = data => {
    return ajax({
        url: '/api/query-data'
        method: 'get'
        params: data,
        // 重复时,取消前请求
        repeatCancelable: true,
    });
}

queryData() // 当前请求会被取消

queryData()
  • 不可重复提交的请求
import ajax from './http.js'

// 可锁定的提交请求
const postData = data => {
    return ajax({
        url: '/api/post-data'
        method: 'post'
        data,
        // 表示不可重复提交
        lockable: true,
    });
}

postData({ a: 'xxx'} );

postData({ a: 'xxx'} ); // 当前请求不能发起
  • 可缓存的请求
import ajax from './http.js'

// 可缓存的查询请求
const getCity = data => {
    return ajax({
        url: '/api/get-city'
        method: 'get'
        params: data,
        // 表示可以缓存请求
        cacheable: true,
    });
}

getCity().then(() => {
    getCity(); // 当前请求会直接去缓存数据
})

axios-repeat api

axios 扩展

取消请求扩展

  • cancelableAxios(axiosAdapter, options): 取消请求的扩展
    • axiosAdapter:自定义或用 axios 默认的适配器
    • options
      • switchRouteCancelable:切换路由时,是否取消所有未完成的请求
  • cancelAllAxios(): 取消所有未完成的请求
  • isCancel(error): 判断该请求是否被取消,在 catch 中,通过 error 判断
    • error:报错对象

锁定请求扩展

  • lockableAxios(axiosAdapter): 不能重复提交请求的扩展
    • axiosAdapter:自定义或用 axios 默认的适配器
  • deleteLockedUrl(url): 手动删除请求,入列的提交请求需要使用
    • url:string,请求地址
  • isRepeatSubmit(error): 判断该请求是否因为重复提交被阻止,在 catch 中,通过 error 判断
    • error:报错对象

缓存请求扩展

  • cacheableAxios(axiosAdapter, options):缓存请求的扩展
    • axiosAdapter:自定义或用 axios 默认的适配器
    • options
      • cacheTimeout:boolean,缓存请求的过期间隔,单位毫秒,默认为 2 分钟(120000 ms)
      • isNeedCache:(res: any) => boolean, 获取数据之后是否能缓存
      • maxCahceNumber: number,最多缓存的数据条数, 默认 50 条
  • deleteCacheItem(url): 删除缓存项
    • url:string,请求地址

请求配置(config)

const requestExtensionsConfig = {
    // 重复时,取消未完成的前请求
    repeatCancelable: boolean,
    // 切换路由时,是否取消所有未完成的请求
    switchRouteCancelable: boolean,
    // 是否不能重复提交请求
    lockable: boolean,
    // lockable 为 true 时,该请求是否为入队列的提交请求(就是提交结果需要异步获取),如果是,则提交完成后需要手动删除请求
    isEnqueueSubmit: boolean
    // 是否可以缓存请求
    cacheable: boolean,
    // cacheable 为 true 时,是否强制更新缓存数据
    forceUpdate: boolean,
}

// axios
ajax({
    ...axios.config,
    ...requestExtensionsConfig,
})