diff --git a/miniprogram/core/Api.ts b/miniprogram/core/Api.ts index 486d673..0187c89 100644 --- a/miniprogram/core/Api.ts +++ b/miniprogram/core/Api.ts @@ -1,3 +1,4 @@ +import mitt, { Emitter } from "./EventEmitter"; import { LogLabel } from "./LogLabel"; import { Logger } from "./Logger"; import { LevelLogLabel, colorRadio } from "./PresetLogLabel"; @@ -62,13 +63,33 @@ type IParamSetting = { } } +/** + * API 事件 + */ +type IAPIEvent = { + + /** + * 当数据初始化事件 + */ + initData: Partial; + + /** + * 请求数据解析完成后 + */ + parseRequestData: Partial; +} + /** * 接口调用 */ class API { + /** + * 基础 URL + * TODO: 这里可能涉及负载均衡 + */ public static get baseUrl():string { - return "https://xxx.xxx" + return "https://xxx.xxx"; } public static defaultLogLabel:LogLabel = new LogLabel( @@ -80,6 +101,15 @@ class API { */ private LogLabel:LogLabel = API.defaultLogLabel; + /** + * 事件监听器 + */ + private emitter:Emitter>; + + public get on() { return this.emitter.on }; + public get off() { return this.emitter.on }; + public get emit() { return this.emitter.emit }; + /** * Api 唯一 ID */ @@ -105,15 +135,21 @@ class API { */ public requestData?:IWxRequestOption; - /** - * 超时时间 (wx.request) - */ - public timeout?:number; + //#region wx.request - /** - * 请求方法 (wx.request) - */ + public timeout?:number; 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 { */ public constructor(data?: Partial) { this.data = data ?? {}; + this.emitter = mitt>(); } /** @@ -185,6 +222,9 @@ class API { } } } + + // 触发数据初始化事件 + this.emit("initData", this.data); } /** @@ -201,28 +241,51 @@ class API { // 重置请求数据 const requestData:IWxRequestOption = this.requestData = { 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>); + } + } + + // 触发数据解析 + this.emit("parseRequestData", this.data); + + // 数据收集 for (let key in this.params) { let data = this.data[key]; - let { isHeader, isTemplate, parse } = this.params[key]; - - // 数据预解析 - if (parse !== void 0) { - data = parse(data!, key, this.data as DeepReadonly>); - } + let { isHeader, isTemplate } = this.params[key]; // 加载数据 if (!isTemplate) { if (isHeader) { - wx.request + requestData.header![key] = data; + } else { + (requestData.data as IAnyData)[key] = data; } } } } } +/** + * HTTP 请求类型 + */ enum HTTPMethod { OPTIONS = "OPTIONS", GET = "GET", diff --git a/miniprogram/pages/Timetable/TestCore.ts b/miniprogram/pages/Timetable/TestCore.ts index 0cb5ac3..9e3b51e 100644 --- a/miniprogram/pages/Timetable/TestCore.ts +++ b/miniprogram/pages/Timetable/TestCore.ts @@ -33,7 +33,8 @@ implements Partial { public override params: IParamSetting = { name: { - tester: "123" + tester: "123", + isHeader: true }, id: { parse: (i) => ++i, @@ -43,8 +44,15 @@ implements Partial { public constructor(data:ITestApiInput) { super(data); + this.on("initData", (data) => { + console.log("initData", data) + }) + this.on("parseRequestData", (data) => { + console.log("parseRequestData", data) + }) this.initLabel(); this.initData(); + this.collectData(); } }