lingxixue-web/src/api/only-last.ts
2026-05-09 10:34:51 +08:00

66 lines
1.6 KiB
TypeScript

import type { AxiosRequestConfig } from 'axios'
import obj from '@/utils/obj'
// 同时有多个请求时,只有最后一个请求生效
export const only_last_id = 'on_last_id'
const only_last_req_id = 'only_last_req_id'
const controllers = {} as Record<string, AbortController>
const reqIds = {} as Record<string, string>
export type RequestConfig = AxiosRequestConfig & {
[only_last_id]?: any
[only_last_req_id]?: any
}
function processRequest(config: RequestConfig) {
if (!config) return
const onlyLastId = config[only_last_id]
if (!onlyLastId) return
// 取消上一个请求
let ctl = controllers[onlyLastId]
if (ctl) {
ctl.abort()
// console.log('❌取消❌', onlyLastId, reqIds[onlyLastId], config.url)
}
// 重新赋值
ctl = new AbortController()
config.signal = ctl.signal
controllers[onlyLastId] = ctl
// 赋值一个请求的唯一id
const reqId = obj.snowflakeId()
reqIds[onlyLastId] = reqId
config[only_last_req_id] = reqId
// console.log('💪🏻开启💪🏻', onlyLastId, reqId, config.url)
}
function processResponse(config: RequestConfig) {
if (!config) return true
const onlyLastId = config[only_last_id]
// 忽略
if (!onlyLastId) return true
const reqId = config[only_last_req_id]
if (reqId === reqIds[onlyLastId]) {
// console.log('✅选用✅', onlyLastId, reqId, config.url)
delete reqIds[onlyLastId]
delete controllers[onlyLastId]
// 忽略
return true
} else {
// console.log('⭕️抛弃⭕️', onlyLastId, reqId, config.url)
// 过滤请求
return false
}
}
const onlyLastApi = {
processRequest,
processResponse,
}
export default onlyLastApi