import { isFunction } from '@tarojs/shared' import type { TFunc } from '@tarojs/runtime' export interface ICallbackResult { /** 错误信息 */ errMsg: string } type TCallback> = (res: T) => Promise | void interface IMethodParam> { name: string success?: TCallback fail?: TCallback complete?: TCallback } interface IMockPromise { resolve?: typeof Promise.resolve | TFunc reject?: typeof Promise.reject | TFunc } export class MethodHandler> { methodName: string protected __success?: TCallback protected __fail?: TCallback protected __complete?: TCallback protected isHandlerError = false constructor ({ name, success, fail, complete }: IMethodParam) { this.methodName = name this.__success = success this.__fail = fail this.__complete = complete this.isHandlerError = isFunction(this.__complete) || isFunction(this.__fail) } success> (res: Partial & Partial = {}, promise: IMockPromise = {}): Promise { if (!res.errMsg) { res.errMsg = `${this.methodName}:ok` } isFunction(this.__success) && this.__success(res as T) isFunction(this.__complete) && this.__complete(res as T) const { resolve = Promise.resolve.bind(Promise) } = promise return resolve(res as Required) } fail> (res: Partial & Partial = {}, promise: IMockPromise = {}): Promise { if (!res.errMsg) { res.errMsg = `${this.methodName}:fail` } else { res.errMsg = `${this.methodName}:fail ${res.errMsg}` } isFunction(this.__fail) && this.__fail(res) isFunction(this.__complete) && this.__complete(res as ICallbackResult) const { resolve = Promise.resolve.bind(Promise), reject = Promise.reject.bind(Promise) } = promise return this.isHandlerError ? resolve(res as Required) : reject(res) } } type TCallbackManagerFunc = (...arr: T) => void interface ICallbackManagerOption { callback?: TCallbackManagerFunc ctx?: any [key: string]: unknown } type TCallbackManagerUnit = (TCallbackManagerFunc | ICallbackManagerOption) export class CallbackManager { callbacks: TCallbackManagerUnit[] = [] /** 添加回调 */ add = (opt?: TCallbackManagerUnit) => { if (opt) this.callbacks.push(opt) } /** 移除回调 */ remove = (opt?: TCallbackManagerUnit) => { if (opt) { let pos = -1 this.callbacks.forEach((callback, k) => { if (callback === opt) { pos = k } }) if (pos > -1) { this.callbacks.splice(pos, 1) } } } /** 获取回调函数数量 */ count = () => { return this.callbacks.length } /** 触发回调 */ trigger = (...args: T) => { this.callbacks.forEach(opt => { if (isFunction(opt)) { opt(...args) } else { const { callback, ctx } = opt isFunction(callback) && callback.call(ctx, ...args) } }) } }