From b3fc9de5b4028733473c52796b02d86791585aa1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E4=BA=9A=E6=98=95?= <1549469775@qq.com> Date: Mon, 7 Apr 2025 11:44:22 +0800 Subject: [PATCH] fix -bug --- packages/.vitepress/config.ts | 14 ++++ packages/.vitepress/modules.ts | 14 ++-- packages/core/src/array/demote/index.ts | 6 ++ packages/core/src/array/index.ts | 4 + packages/core/src/array/random/index.ts | 4 + packages/core/src/array/uniq/index.ts | 4 + packages/core/src/async/asyncController.ts | 128 +++++++++++++++++++++++++++++ packages/core/src/async/docs/index.md | 8 ++ packages/core/src/async/docs/index.vue | 70 ++++++++++++++++ packages/core/src/async/index.ts | 2 + packages/core/src/index.ts | 2 + packages/core/src/utils/index.ts | 4 + 12 files changed, 255 insertions(+), 5 deletions(-) create mode 100644 packages/core/src/array/demote/index.ts create mode 100644 packages/core/src/array/index.ts create mode 100644 packages/core/src/array/random/index.ts create mode 100644 packages/core/src/array/uniq/index.ts create mode 100644 packages/core/src/async/asyncController.ts create mode 100644 packages/core/src/async/docs/index.md create mode 100644 packages/core/src/async/docs/index.vue create mode 100644 packages/core/src/async/index.ts create mode 100644 packages/core/src/utils/index.ts diff --git a/packages/.vitepress/config.ts b/packages/.vitepress/config.ts index 0cc5471..12f7efa 100644 --- a/packages/.vitepress/config.ts +++ b/packages/.vitepress/config.ts @@ -24,6 +24,18 @@ const userConfig = defineConfig({ socialLinks: [{ icon: "github", link: "https://github.com/npmrun/xyx-utils" }], // https://juejin.cn/post/7227358177489961018#heading-5 // sidebar, + search: { + provider: "local", + options: { + async _render(src, env, md) { + const html = await md.render(src, env); + if (env.frontmatter?.search === false) return ""; + if (env.frontmatter?.title) + return await md.render(`# ${env.frontmatter.title}`) + html + return html; + }, + }, + }, }, markdown: { theme: { @@ -35,6 +47,8 @@ const userConfig = defineConfig({ md.use(componentPreview, { clientOnly: true }); }, }, + // srcExclude: ['**/CHANGELOG.md'], + srcExclude: ['**/xyx-utils/CHANGELOG.md'], vite: { resolve: { alias: { diff --git a/packages/.vitepress/modules.ts b/packages/.vitepress/modules.ts index acb529d..4e81589 100644 --- a/packages/.vitepress/modules.ts +++ b/packages/.vitepress/modules.ts @@ -1,11 +1,15 @@ import { getSideBar } from "./getSideBar"; -function getTree(name: string[]) { +function getTree(name: string[], changelog) { const result: any[] = [ { text: "<- 总目录", link: "/guide/introduction", }, + { + text: "修改记录", + link: changelog, + }, ]; result.push( ...(getSideBar("./packages", { @@ -55,8 +59,8 @@ export const getSidebar = () => ({ items: getAllModule(), }, ], - "/browser/": getTree(["browser/src"]), - "/node/": getTree(["node/src"]), - "/core/": getTree(["core/src"]), - "/vue3/": getTree(["vue3/src"]), + "/browser/": getTree(["browser/src"], "/browser/CHANGELOG"), + "/node/": getTree(["node/src"], "/node/CHANGELOG"), + "/core/": getTree(["core/src"], "/core/CHANGELOG"), + "/vue3/": getTree(["vue3/src"], "/vue3/CHANGELOG"), }); diff --git a/packages/core/src/array/demote/index.ts b/packages/core/src/array/demote/index.ts new file mode 100644 index 0000000..5b604e4 --- /dev/null +++ b/packages/core/src/array/demote/index.ts @@ -0,0 +1,6 @@ +import { isArray } from "@xyx-utils/core/utils" + +export function demote(arr: any[], result: any[] = []) { + arr.forEach((i) => (isArray(i) ? demote(i, result) : result.push(i))) + return result +} \ No newline at end of file diff --git a/packages/core/src/array/index.ts b/packages/core/src/array/index.ts new file mode 100644 index 0000000..adf5186 --- /dev/null +++ b/packages/core/src/array/index.ts @@ -0,0 +1,4 @@ + +export * from "./random" +export * from "./demote" +export * from "./uniq" \ No newline at end of file diff --git a/packages/core/src/array/random/index.ts b/packages/core/src/array/random/index.ts new file mode 100644 index 0000000..5bc7ed3 --- /dev/null +++ b/packages/core/src/array/random/index.ts @@ -0,0 +1,4 @@ + +export function random(arr: any[]) { + return arr.sort(() => Math.random() - 0.5) +} \ No newline at end of file diff --git a/packages/core/src/array/uniq/index.ts b/packages/core/src/array/uniq/index.ts new file mode 100644 index 0000000..b71ee20 --- /dev/null +++ b/packages/core/src/array/uniq/index.ts @@ -0,0 +1,4 @@ + +export function uniq(arr: any[]) { + return Array.from(new Set(arr)) +} \ No newline at end of file diff --git a/packages/core/src/async/asyncController.ts b/packages/core/src/async/asyncController.ts new file mode 100644 index 0000000..22ec164 --- /dev/null +++ b/packages/core/src/async/asyncController.ts @@ -0,0 +1,128 @@ +/** + * 任务执行状态枚举类 + * @type {{INIT: number, RUNNING: number, FINISH: number}} + */ +const enum TaskStatusEnum { + INIT = -1, //初始化 + RUNNING = 0, //执行中 + FINISH = 1, //已完成 +} + +type ITask = (end: Function) => void; + +/** + * 任务单元 + * @param taskId 任务id + * @param task 任务函数 + * @param group 任务组对象 + * @constructor + */ +class TaskUnit { + taskId: number; + status: TaskStatusEnum; + task: ITask; + private group: TaskGroup; + + constructor(taskId: number, task: ITask, group: any) { + this.taskId = taskId; //任务唯一标识,暂时没用到 + this.status = TaskStatusEnum.INIT; //执行状态:-1初始化 0执行中 1已完成 + this.task = task; //任务内容 + this.group = group; // 任务组对象 + } + + execute() { + this.status = TaskStatusEnum.RUNNING; + const end = () => this.end(); + this.task(end); + } + + end() { + if (this.status === TaskStatusEnum.RUNNING) { + this.status = TaskStatusEnum.FINISH; + this.group.check(); + } + } +} + +class TaskGroup { + nextGroup: TaskGroup | null = null; + taskList: TaskUnit[] = []; + + constructor() {} + add(task: TaskUnit) { + this.taskList.push(task); + } + setNextGroup(group: TaskGroup) { + this.nextGroup = group; + } + start() { + for (let i = 0; i < this.taskList.length; i++) { + const task = this.taskList[i]; + if (task.status === TaskStatusEnum.INIT) { + task.execute(); //执行 + } + } + } + check() { + for (let i = 0; i < this.taskList.length; i++) { + if (this.taskList[i].status !== TaskStatusEnum.FINISH) { + return; //发现还有任务没有执行完成 + } + } + //任务全部执行完成,进行下一个任务组 + this.taskList = []; //清空当前任务组,让这些任务尽快回收 + if (this.nextGroup) { + let nextGroupTemp = this.nextGroup; + nextGroupTemp.start(); + this.nextGroup = null; //取消引用,让当前任务组尽快回收 + } + } +} + +export class asyncController { + queue: TaskGroup[] = []; + nowTaskGroup: TaskGroup | null = null; + startCount: number = 0; + + /** + * 调用该函数表示添加并行任务 + * @param task 任务 + */ + and(task: T) { + if (this.nowTaskGroup == null) { + this.nowTaskGroup = new TaskGroup(); + } + this.nowTaskGroup.add(new TaskUnit(++this.startCount, task, this.nowTaskGroup)); + return this; + } + /** + * 调用该函数表示添加串行任务 + * @param task 任务 + */ + next(task: T) { + if (this.nowTaskGroup != null) this.queue.push(this.nowTaskGroup); //防止上一个添加的任务是并行的 + this.nowTaskGroup = new TaskGroup(); + this.nowTaskGroup.add(new TaskUnit(++this.startCount, task, this.nowTaskGroup)); + this.queue.push(this.nowTaskGroup); + this.nowTaskGroup = null; //当前任务添加结束清空 + return this; + } + /** + * 调用该函数表示任务添加完毕,开始执行任务 + * @param endTask 任务全部结束后回调 + */ + finish = (endTask: T) => { + if (this.nowTaskGroup != null) this.queue.push(this.nowTaskGroup); + this.nowTaskGroup = new TaskGroup(); + this.nowTaskGroup.add(new TaskUnit(++this.startCount, endTask, this.nowTaskGroup)); + this.queue.push(this.nowTaskGroup); + this.nowTaskGroup = null; //当前任务添加结束清空 + + //组装成单向链表 + for (let i = 0; i < this.queue.length - 1; i++) { + this.queue[i].setNextGroup(this.queue[i + 1]); + } + this.queue[0].start(); //启动链表首个任务组 + this.queue = []; //清空任务,为下一波任务做准备 + }; +} diff --git a/packages/core/src/async/docs/index.md b/packages/core/src/async/docs/index.md new file mode 100644 index 0000000..fa28919 --- /dev/null +++ b/packages/core/src/async/docs/index.md @@ -0,0 +1,8 @@ +--- +title: asyncController +category: 异步控制器 +--- + +Demo: + + \ No newline at end of file diff --git a/packages/core/src/async/docs/index.vue b/packages/core/src/async/docs/index.vue new file mode 100644 index 0000000..93ca3ca --- /dev/null +++ b/packages/core/src/async/docs/index.vue @@ -0,0 +1,70 @@ + + + \ No newline at end of file diff --git a/packages/core/src/async/index.ts b/packages/core/src/async/index.ts new file mode 100644 index 0000000..f26b7b6 --- /dev/null +++ b/packages/core/src/async/index.ts @@ -0,0 +1,2 @@ + +export * from "./asyncController" \ No newline at end of file diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index d0223f2..1821ea6 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -3,3 +3,5 @@ export * from "./common"; export * from "./debounce"; export * from "./throttle"; export * from "./path"; +export * from "./async" +export * from "./array" \ No newline at end of file diff --git a/packages/core/src/utils/index.ts b/packages/core/src/utils/index.ts new file mode 100644 index 0000000..4f2994d --- /dev/null +++ b/packages/core/src/utils/index.ts @@ -0,0 +1,4 @@ + +export function isArray(arr) { + return Array.isArray(arr) +} \ No newline at end of file