Add API Module!
This commit is contained in:
parent
0140136a0b
commit
c3773a3c71
@ -1,3 +1,4 @@
|
|||||||
|
import mitt, { Emitter } from "./EventEmitter";
|
||||||
import { LogLabel } from "./LogLabel";
|
import { LogLabel } from "./LogLabel";
|
||||||
import { Logger } from "./Logger";
|
import { Logger } from "./Logger";
|
||||||
import { LevelLogLabel, colorRadio } from "./PresetLogLabel";
|
import { LevelLogLabel, colorRadio } from "./PresetLogLabel";
|
||||||
@ -62,13 +63,33 @@ type IParamSetting<T extends IAnyData> = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* API 事件
|
||||||
|
*/
|
||||||
|
type IAPIEvent<I extends IAnyData, O extends IAnyData> = {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当数据初始化事件
|
||||||
|
*/
|
||||||
|
initData: Partial<I>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 请求数据解析完成后
|
||||||
|
*/
|
||||||
|
parseRequestData: Partial<I>;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 接口调用
|
* 接口调用
|
||||||
*/
|
*/
|
||||||
class API<I extends IAnyData, O extends IAnyData> {
|
class API<I extends IAnyData, O extends IAnyData> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 基础 URL
|
||||||
|
* TODO: 这里可能涉及负载均衡
|
||||||
|
*/
|
||||||
public static get baseUrl():string {
|
public static get baseUrl():string {
|
||||||
return "https://xxx.xxx"
|
return "https://xxx.xxx";
|
||||||
}
|
}
|
||||||
|
|
||||||
public static defaultLogLabel:LogLabel = new LogLabel(
|
public static defaultLogLabel:LogLabel = new LogLabel(
|
||||||
@ -80,6 +101,15 @@ class API<I extends IAnyData, O extends IAnyData> {
|
|||||||
*/
|
*/
|
||||||
private LogLabel:LogLabel = API.defaultLogLabel;
|
private LogLabel:LogLabel = API.defaultLogLabel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 事件监听器
|
||||||
|
*/
|
||||||
|
private emitter:Emitter<IAPIEvent<I, O>>;
|
||||||
|
|
||||||
|
public get on() { return this.emitter.on };
|
||||||
|
public get off() { return this.emitter.on };
|
||||||
|
public get emit() { return this.emitter.emit };
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Api 唯一 ID
|
* Api 唯一 ID
|
||||||
*/
|
*/
|
||||||
@ -105,15 +135,21 @@ class API<I extends IAnyData, O extends IAnyData> {
|
|||||||
*/
|
*/
|
||||||
public requestData?:IWxRequestOption<O>;
|
public requestData?:IWxRequestOption<O>;
|
||||||
|
|
||||||
/**
|
//#region wx.request
|
||||||
* 超时时间 (wx.request)
|
|
||||||
*/
|
|
||||||
public timeout?:number;
|
|
||||||
|
|
||||||
/**
|
public timeout?:number;
|
||||||
* 请求方法 (wx.request)
|
|
||||||
*/
|
|
||||||
public method:HTTPMethod = HTTPMethod.GET;
|
public method:HTTPMethod = HTTPMethod.GET;
|
||||||
|
public enableHttp2:boolean = false;
|
||||||
|
public enableQuic:boolean = false;
|
||||||
|
public enableCache:boolean = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否自动解析返回的 json
|
||||||
|
* 对应 wx.request 的 dataType
|
||||||
|
*/
|
||||||
|
public jsonParse:boolean = true;
|
||||||
|
|
||||||
|
//#endregion wx.request
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 构造函数
|
* 构造函数
|
||||||
@ -122,6 +158,7 @@ class API<I extends IAnyData, O extends IAnyData> {
|
|||||||
*/
|
*/
|
||||||
public constructor(data?: Partial<I>) {
|
public constructor(data?: Partial<I>) {
|
||||||
this.data = data ?? {};
|
this.data = data ?? {};
|
||||||
|
this.emitter = mitt<IAPIEvent<I, O>>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -185,6 +222,9 @@ class API<I extends IAnyData, O extends IAnyData> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 触发数据初始化事件
|
||||||
|
this.emit("initData", this.data);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -201,28 +241,51 @@ class API<I extends IAnyData, O extends IAnyData> {
|
|||||||
// 重置请求数据
|
// 重置请求数据
|
||||||
const requestData:IWxRequestOption<O> = this.requestData = {
|
const requestData:IWxRequestOption<O> = this.requestData = {
|
||||||
url: API.baseUrl + this.url,
|
url: API.baseUrl + this.url,
|
||||||
|
data: {}, header: {},
|
||||||
|
timeout: this.timeout,
|
||||||
|
method: this.method,
|
||||||
|
dataType: this.jsonParse ? "json" : undefined,
|
||||||
|
enableHttp2: this.enableHttp2,
|
||||||
|
enableQuic: this.enableQuic,
|
||||||
|
enableCache: this.enableCache
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 数据解析
|
||||||
|
for (let key in this.params) {
|
||||||
|
|
||||||
|
let data = this.data[key];
|
||||||
|
let { parse } = this.params[key];
|
||||||
|
|
||||||
|
// 数据预解析
|
||||||
|
if (parse !== void 0) {
|
||||||
|
this.data[key] = parse(data!, key, this.data as DeepReadonly<Partial<I>>);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 触发数据解析
|
||||||
|
this.emit("parseRequestData", this.data);
|
||||||
|
|
||||||
|
// 数据收集
|
||||||
for (let key in this.params) {
|
for (let key in this.params) {
|
||||||
|
|
||||||
let data = this.data[key];
|
let data = this.data[key];
|
||||||
let { isHeader, isTemplate, parse } = this.params[key];
|
let { isHeader, isTemplate } = this.params[key];
|
||||||
|
|
||||||
// 数据预解析
|
|
||||||
if (parse !== void 0) {
|
|
||||||
data = parse(data!, key, this.data as DeepReadonly<Partial<I>>);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 加载数据
|
// 加载数据
|
||||||
if (!isTemplate) {
|
if (!isTemplate) {
|
||||||
if (isHeader) {
|
if (isHeader) {
|
||||||
wx.request
|
requestData.header![key] = data;
|
||||||
|
} else {
|
||||||
|
(requestData.data as IAnyData)[key] = data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HTTP 请求类型
|
||||||
|
*/
|
||||||
enum HTTPMethod {
|
enum HTTPMethod {
|
||||||
OPTIONS = "OPTIONS",
|
OPTIONS = "OPTIONS",
|
||||||
GET = "GET",
|
GET = "GET",
|
||||||
|
@ -33,7 +33,8 @@ implements Partial<ILifetime> {
|
|||||||
|
|
||||||
public override params: IParamSetting<ITestApiInput> = {
|
public override params: IParamSetting<ITestApiInput> = {
|
||||||
name: {
|
name: {
|
||||||
tester: "123"
|
tester: "123",
|
||||||
|
isHeader: true
|
||||||
},
|
},
|
||||||
id: {
|
id: {
|
||||||
parse: (i) => ++i,
|
parse: (i) => ++i,
|
||||||
@ -43,8 +44,15 @@ implements Partial<ILifetime> {
|
|||||||
|
|
||||||
public constructor(data:ITestApiInput) {
|
public constructor(data:ITestApiInput) {
|
||||||
super(data);
|
super(data);
|
||||||
|
this.on("initData", (data) => {
|
||||||
|
console.log("initData", data)
|
||||||
|
})
|
||||||
|
this.on("parseRequestData", (data) => {
|
||||||
|
console.log("parseRequestData", data)
|
||||||
|
})
|
||||||
this.initLabel();
|
this.initLabel();
|
||||||
this.initData();
|
this.initData();
|
||||||
|
this.collectData();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user