2023-07-06 20:59:22 +08:00
|
|
|
|
import request from './request';
|
2023-12-07 01:07:34 +08:00
|
|
|
|
import { randomUuid } from './utils/string';
|
2021-06-07 17:22:07 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 可用于各模块定义各自api请求
|
|
|
|
|
|
*/
|
|
|
|
|
|
class Api {
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 请求url
|
|
|
|
|
|
*/
|
|
|
|
|
|
url: string;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 请求方法
|
|
|
|
|
|
*/
|
|
|
|
|
|
method: string;
|
|
|
|
|
|
|
2023-12-06 09:23:23 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 请求前处理函数
|
|
|
|
|
|
* param1: param请求参数
|
|
|
|
|
|
*/
|
|
|
|
|
|
beforeHandler: Function;
|
|
|
|
|
|
|
2023-12-07 01:07:34 +08:00
|
|
|
|
static abortControllers: Map<string, AbortController> = new Map();
|
|
|
|
|
|
|
2021-06-07 17:22:07 +08:00
|
|
|
|
constructor(url: string, method: string) {
|
|
|
|
|
|
this.url = url;
|
|
|
|
|
|
this.method = method;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-12-06 09:23:23 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 设置请求前处理回调函数
|
|
|
|
|
|
* @param func 请求前处理器
|
|
|
|
|
|
* @returns this
|
|
|
|
|
|
*/
|
|
|
|
|
|
withBeforeHandler(func: Function) {
|
|
|
|
|
|
this.beforeHandler = func;
|
|
|
|
|
|
return this;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-06-07 17:22:07 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 获取权限的完整url
|
|
|
|
|
|
*/
|
|
|
|
|
|
getUrl() {
|
|
|
|
|
|
return request.getApiUrl(this.url);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
2023-07-06 20:59:22 +08:00
|
|
|
|
* 请求对应的该api
|
2023-04-13 20:11:22 +08:00
|
|
|
|
* @param {Object} param 请求该api的参数
|
2021-06-07 17:22:07 +08:00
|
|
|
|
*/
|
2023-12-09 16:17:26 +08:00
|
|
|
|
request(param: any = null, options: any = {}): Promise<any> {
|
2023-12-06 09:23:23 +08:00
|
|
|
|
if (this.beforeHandler) {
|
|
|
|
|
|
this.beforeHandler(param);
|
|
|
|
|
|
}
|
2023-12-09 16:17:26 +08:00
|
|
|
|
return request.request(this.method, this.url, param, options);
|
2021-06-07 17:22:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-12-07 01:07:34 +08:00
|
|
|
|
/**
|
2023-12-09 16:17:26 +08:00
|
|
|
|
* 允许取消的请求, 使用Api.cancelReq(key) 取消请求
|
|
|
|
|
|
* @param key 用于取消该key关联的请求
|
2023-12-07 01:07:34 +08:00
|
|
|
|
* @param {Object} param 请求该api的参数
|
|
|
|
|
|
*/
|
2023-12-09 16:17:26 +08:00
|
|
|
|
allowCancelReq(key: string, param: any = null, options: RequestInit = {}): Promise<any> {
|
2023-12-07 01:07:34 +08:00
|
|
|
|
let controller = Api.abortControllers.get(key);
|
|
|
|
|
|
if (!controller) {
|
|
|
|
|
|
controller = new AbortController();
|
|
|
|
|
|
Api.abortControllers.set(key, controller);
|
|
|
|
|
|
}
|
2023-12-09 16:17:26 +08:00
|
|
|
|
options.signal = controller.signal;
|
2023-12-07 01:07:34 +08:00
|
|
|
|
|
2023-12-09 16:17:26 +08:00
|
|
|
|
return this.request(param, options);
|
2023-12-07 01:07:34 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2021-06-07 17:22:07 +08:00
|
|
|
|
/** 静态方法 **/
|
|
|
|
|
|
|
2023-12-07 01:07:34 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 取消请求
|
|
|
|
|
|
* @param key 请求key
|
|
|
|
|
|
*/
|
|
|
|
|
|
static cancelReq(key: string) {
|
|
|
|
|
|
let controller = Api.abortControllers.get(key);
|
|
|
|
|
|
if (controller) {
|
|
|
|
|
|
controller.abort();
|
|
|
|
|
|
Api.removeAbortKey(key);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static removeAbortKey(key: string) {
|
|
|
|
|
|
if (key) {
|
|
|
|
|
|
console.log('remove abort key: ', key);
|
|
|
|
|
|
Api.abortControllers.delete(key);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 根据旧key生成新的abort key,可能旧key未取消,造成多余无用对象
|
|
|
|
|
|
* @param oldKey 旧key
|
|
|
|
|
|
* @returns key
|
|
|
|
|
|
*/
|
|
|
|
|
|
static genAbortKey(oldKey: string) {
|
|
|
|
|
|
if (!oldKey) {
|
|
|
|
|
|
return randomUuid();
|
|
|
|
|
|
}
|
|
|
|
|
|
if (Api.abortControllers.get(oldKey)) {
|
|
|
|
|
|
return oldKey;
|
|
|
|
|
|
}
|
|
|
|
|
|
return randomUuid();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-06-07 17:22:07 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 静态工厂,返回Api对象,并设置url与method属性
|
|
|
|
|
|
* @param url url
|
|
|
|
|
|
* @param method 请求方法(get,post,put,delete...)
|
|
|
|
|
|
*/
|
2023-07-06 20:59:22 +08:00
|
|
|
|
static create(url: string, method: string): Api {
|
2021-06-07 17:22:07 +08:00
|
|
|
|
return new Api(url, method);
|
|
|
|
|
|
}
|
2023-04-13 20:11:22 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 创建get api
|
|
|
|
|
|
* @param url url
|
|
|
|
|
|
*/
|
|
|
|
|
|
static newGet(url: string): Api {
|
|
|
|
|
|
return Api.create(url, 'get');
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* new post api
|
|
|
|
|
|
* @param url url
|
|
|
|
|
|
*/
|
|
|
|
|
|
static newPost(url: string): Api {
|
|
|
|
|
|
return Api.create(url, 'post');
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* new put api
|
|
|
|
|
|
* @param url url
|
|
|
|
|
|
*/
|
|
|
|
|
|
static newPut(url: string): Api {
|
|
|
|
|
|
return Api.create(url, 'put');
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* new delete api
|
|
|
|
|
|
* @param url url
|
|
|
|
|
|
*/
|
|
|
|
|
|
static newDelete(url: string): Api {
|
|
|
|
|
|
return Api.create(url, 'delete');
|
|
|
|
|
|
}
|
2021-06-07 17:22:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-07-06 20:59:22 +08:00
|
|
|
|
export default Api;
|