diff --git a/src/type.d.ts b/src/type.d.ts new file mode 100644 index 0000000..a7b34af --- /dev/null +++ b/src/type.d.ts @@ -0,0 +1,7 @@ +export type Optional = { + [P in keyof T]?: T[P] | null; +}; + +export type Nullable = { + [P in keyof T]: T[P] | null; +}; diff --git a/src/utils/request.ts b/src/utils/request.ts index 9b28edb..42c2b04 100644 --- a/src/utils/request.ts +++ b/src/utils/request.ts @@ -48,15 +48,20 @@ export class Request { return this.instance; } - get(url: string, option?: AxiosRequestConfig): Promise> { - const reqConfig = option ?? {}; + get(url: string, option?: AxiosRequestConfig & { retRaw?: boolean }): Promise> { + const { retRaw, ...reqConfig } = option ?? {}; return new Promise((resolve) => { this.instance - .get>(url, { + .get(url, { ...reqConfig, }) .then((res) => { - resolve([null, res.data.data, res.data]); + if (retRaw) { + resolve([null, res.data as T, null]); + } else { + const resData = res.data as Result; + resolve([null, resData.data, resData]); + } }) .catch((err) => { resolve([err as AxiosError, null, null]); diff --git a/src/utils/sleep.ts b/src/utils/sleep.ts new file mode 100644 index 0000000..a4bf061 --- /dev/null +++ b/src/utils/sleep.ts @@ -0,0 +1,28 @@ +// 宏任务,下一个事件循环周期执行 +export const sleep = (ms: number = 0) => { + return new Promise((resolve) => setTimeout(resolve, ms)); +}; + +// 微任务版本 - 最快让出控制权 +// 微任务,当前事件循环周期的末尾执行 +export const sleepMicrotask = () => { + return new Promise((resolve) => queueMicrotask(() => resolve)); +}; + +// 空闲时执行版本 - 性能友好 +export const sleepIdle = () => { + return new Promise((resolve) => { + if ('requestIdleCallback' in window) { + requestIdleCallback(resolve); + } else { + // fallback to setTimeout + setTimeout(resolve, 0); + } + }); +}; + +// 帧同步版本 - 适合动画 +// 在下一次重绘前执行 +export const sleepFrame = () => { + return new Promise((resolve) => requestAnimationFrame(resolve)); +};