2023-03-23 20:09:00 +08:00
|
|
|
|
export interface InterceptorResolved<T = unknown> {
|
|
|
|
|
(value: T): T | Promise<T>;
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-09 15:20:10 +08:00
|
|
|
|
export interface InterceptorRejected<T = unknown> {
|
|
|
|
|
(error: unknown): T | Promise<T>;
|
2023-03-23 20:09:00 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-04-26 21:03:00 +08:00
|
|
|
|
/**
|
|
|
|
|
* 拦截器
|
|
|
|
|
*/
|
2023-03-23 20:09:00 +08:00
|
|
|
|
export interface Interceptor<T = unknown> {
|
2023-04-26 21:03:00 +08:00
|
|
|
|
/**
|
|
|
|
|
* 成功的回调
|
|
|
|
|
*/
|
2023-03-23 20:09:00 +08:00
|
|
|
|
resolved: InterceptorResolved<T>;
|
2023-04-26 21:03:00 +08:00
|
|
|
|
/**
|
|
|
|
|
* 失败的回调
|
|
|
|
|
*/
|
2023-04-09 15:20:10 +08:00
|
|
|
|
rejected?: InterceptorRejected<T>;
|
2023-03-23 20:09:00 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-04-09 15:20:10 +08:00
|
|
|
|
export interface InterceptorExecutor<T = unknown> {
|
|
|
|
|
(interceptor: Interceptor<T>): void;
|
2023-03-23 20:09:00 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-04-26 21:03:00 +08:00
|
|
|
|
/**
|
|
|
|
|
* 拦截器管理器
|
|
|
|
|
*/
|
2023-03-23 20:09:00 +08:00
|
|
|
|
export default class InterceptorManager<T = unknown> {
|
2023-04-26 21:03:00 +08:00
|
|
|
|
/**
|
|
|
|
|
* 生成拦截器标识符
|
|
|
|
|
*/
|
2023-04-06 16:00:04 +08:00
|
|
|
|
#id = 0;
|
2023-03-23 20:09:00 +08:00
|
|
|
|
|
2023-04-26 21:03:00 +08:00
|
|
|
|
/**
|
|
|
|
|
* 拦截器缓存池
|
|
|
|
|
*/
|
2023-04-17 19:27:44 +08:00
|
|
|
|
#interceptors = new Map<number, Interceptor<T>>();
|
|
|
|
|
|
2023-04-26 21:03:00 +08:00
|
|
|
|
/**
|
2023-05-14 21:44:08 +08:00
|
|
|
|
* @internal
|
|
|
|
|
*
|
2023-04-26 21:03:00 +08:00
|
|
|
|
* 拦截器数量
|
|
|
|
|
*/
|
2023-04-17 19:27:44 +08:00
|
|
|
|
get size() {
|
|
|
|
|
return this.#interceptors.size;
|
|
|
|
|
}
|
2023-03-23 20:09:00 +08:00
|
|
|
|
|
2023-04-26 21:03:00 +08:00
|
|
|
|
/**
|
|
|
|
|
* 添加拦截器
|
|
|
|
|
*
|
|
|
|
|
* @param resolved 成功的回调
|
|
|
|
|
* @param rejected 失败的回调
|
|
|
|
|
* @returns 拦截器标识符(可用于移除拦截器)
|
|
|
|
|
*/
|
2023-04-06 16:00:04 +08:00
|
|
|
|
use(
|
2023-03-23 20:09:00 +08:00
|
|
|
|
resolved: InterceptorResolved<T>,
|
2023-04-09 15:20:10 +08:00
|
|
|
|
rejected?: InterceptorRejected<T>,
|
2023-03-23 20:09:00 +08:00
|
|
|
|
): number {
|
2023-04-17 19:27:44 +08:00
|
|
|
|
this.#interceptors.set(++this.#id, {
|
2023-03-23 20:09:00 +08:00
|
|
|
|
resolved,
|
|
|
|
|
rejected,
|
2023-04-17 19:27:44 +08:00
|
|
|
|
});
|
2023-03-23 20:09:00 +08:00
|
|
|
|
|
2023-04-06 16:00:04 +08:00
|
|
|
|
return this.#id;
|
2023-03-23 20:09:00 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-04-26 21:03:00 +08:00
|
|
|
|
/**
|
|
|
|
|
* 移除拦截器
|
|
|
|
|
*
|
|
|
|
|
* @param id 拦截器标识符
|
|
|
|
|
*/
|
2023-04-17 19:27:44 +08:00
|
|
|
|
eject(id: number): boolean {
|
|
|
|
|
return this.#interceptors.delete(id);
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-26 21:03:00 +08:00
|
|
|
|
/**
|
|
|
|
|
* 清空拦截器
|
|
|
|
|
*/
|
2023-04-17 19:27:44 +08:00
|
|
|
|
clear() {
|
|
|
|
|
this.#interceptors.clear();
|
2023-03-23 20:09:00 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-04-26 21:03:00 +08:00
|
|
|
|
/**
|
2023-05-14 21:44:08 +08:00
|
|
|
|
* @internal
|
|
|
|
|
*
|
2023-04-26 21:03:00 +08:00
|
|
|
|
* 遍历拦截器
|
|
|
|
|
*
|
|
|
|
|
* @param executor 执行器
|
|
|
|
|
*/
|
2023-04-17 19:27:44 +08:00
|
|
|
|
forEach(executor: InterceptorExecutor<T>): void {
|
|
|
|
|
this.#interceptors.forEach(executor);
|
2023-03-23 20:09:00 +08:00
|
|
|
|
}
|
|
|
|
|
}
|