axios-miniprogram/src/core/InterceptorManager.ts

45 lines
1023 B
TypeScript
Raw Normal View History

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
}
export interface Interceptor<T = unknown> {
resolved: InterceptorResolved<T>;
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
}
export default class InterceptorManager<T = unknown> {
#id = 0;
2023-03-23 20:09:00 +08:00
#interceptors: AnyObject<Interceptor<T>> = {};
2023-03-23 20:09:00 +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 {
this.#interceptors[++this.#id] = {
2023-03-23 20:09:00 +08:00
resolved,
rejected,
};
return this.#id;
2023-03-23 20:09:00 +08:00
}
eject(id: number): void {
delete this.#interceptors[id];
2023-03-23 20:09:00 +08:00
}
2023-04-09 15:20:10 +08:00
forEach(executor: InterceptorExecutor<T>, reverse?: boolean): void {
let interceptors: Interceptor<T>[] = Object.values(this.#interceptors);
2023-04-05 08:40:00 +08:00
if (reverse) interceptors = interceptors.reverse();
2023-03-23 20:09:00 +08:00
interceptors.forEach(executor);
}
}