Add API Module #12

Merged
MrKBear merged 4 commits from dev-mrkbear into master 2021-12-30 16:18:24 +08:00
2 changed files with 87 additions and 16 deletions
Showing only changes of commit c3773a3c71 - Show all commits

View File

@ -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",

View File

@ -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();
} }
} }