export type SyncTask = () => void export type AsyncTask = () => Promise export type Task = SyncTask | AsyncTask /** * @description 表示接收一个任务并负责安排其执行时机的调度器。 */ export type Scheduler = (task: Task) => void /** * @description 在微任务队列中安排一个同步任务。 * * @example * ``` * const values: string[] = [] * scheduleMicroTaskSimple(() => { * values.push("micro") * }) * // Expect: ["micro"] * const example1 = await Promise.resolve().then(() => Promise.resolve(values)) * ``` */ export const scheduleMicroTaskSimple = (task: Task): void => { queueMicrotask(() => { void task() }) } /** * @description 在宏任务队列中安排一个任务。 * * @example * ``` * const values: string[] = [] * await new Promise((resolve) => { * scheduleMacroTaskSimple(() => { * values.push("macro") * resolve() * }) * }) * // Expect: ["macro"] * const example1 = values * ``` */ export const scheduleMacroTaskSimple = (task: Task): void => { setTimeout(() => { void task() }, 0) } /** * @description `scheduleMicroTask` 的配置项。 */ export interface ScheduleMicroTaskOptions { task: Task } /** * @description 在微任务队列中安排一个任务。 * * @example * ``` * const values: string[] = [] * scheduleMicroTask({ * task: async () => { * values.push("micro") * }, * }) * // Expect: ["micro"] * const example1 = await Promise.resolve().then(() => Promise.resolve(values)) * ``` */ export const scheduleMicroTask = (options: ScheduleMicroTaskOptions): void => { const { task } = options queueMicrotask(() => { void task() }) } /** * @description `scheduleMacroTask` 的配置项。 */ export interface ScheduleMacroTaskOptions { task: Task timeout?: number } /** * @description 在宏任务队列中安排一个任务。 * * @example * ``` * const values: string[] = [] * await new Promise((resolve) => { * scheduleMacroTask({ * timeout: 0, * task: async () => { * values.push("macro") * resolve() * }, * }) * }) * // Expect: ["macro"] * const example1 = values * ``` */ export const scheduleMacroTask = (options: ScheduleMacroTaskOptions): void => { const { task, timeout = 0 } = options setTimeout(() => { void task() }, timeout) }