Browse Source

fix -bug

main
谢亚昕 6 days ago
parent
commit
b3fc9de5b4
  1. 14
      packages/.vitepress/config.ts
  2. 14
      packages/.vitepress/modules.ts
  3. 6
      packages/core/src/array/demote/index.ts
  4. 4
      packages/core/src/array/index.ts
  5. 4
      packages/core/src/array/random/index.ts
  6. 4
      packages/core/src/array/uniq/index.ts
  7. 128
      packages/core/src/async/asyncController.ts
  8. 8
      packages/core/src/async/docs/index.md
  9. 70
      packages/core/src/async/docs/index.vue
  10. 2
      packages/core/src/async/index.ts
  11. 2
      packages/core/src/index.ts
  12. 4
      packages/core/src/utils/index.ts

14
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: {

14
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"),
});

6
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
}

4
packages/core/src/array/index.ts

@ -0,0 +1,4 @@
export * from "./random"
export * from "./demote"
export * from "./uniq"

4
packages/core/src/array/random/index.ts

@ -0,0 +1,4 @@
export function random(arr: any[]) {
return arr.sort(() => Math.random() - 0.5)
}

4
packages/core/src/array/uniq/index.ts

@ -0,0 +1,4 @@
export function uniq(arr: any[]) {
return Array.from(new Set(arr))
}

128
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<T extends ITask> {
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 = []; //清空任务,为下一波任务做准备
};
}

8
packages/core/src/async/docs/index.md

@ -0,0 +1,8 @@
---
title: asyncController
category: 异步控制器
---
Demo:
<preview path="./index.vue" title="@niu-tools/core" description="asyncController"></preview>

70
packages/core/src/async/docs/index.vue

@ -0,0 +1,70 @@
<script setup lang="ts">
// @ts-nocheck
import { ref } from 'vue'
import { asyncController as Controller } from "@xyx-utils/core"
const outout: string[] = ref([])
console.log = (str) => {
outout.value.push(str)
}
const controller = new Controller();
function run() {
outout.value = []
controller.and(end => {
setTimeout(() => {
console.log("并行1")
end();
}, 2000);
}).and(end => {
setTimeout(() => {
console.log("并行2")
end();
}, 2000);
}).and(end => {
setTimeout(() => {
console.log("并行3")
end();
}, 2000);
}).next(end => {
setTimeout(() => {
console.log("串行1")
end();
}, 2000);
}).next(end => {
setTimeout(() => {
console.log("串行2")
end();
}, 2000);
}).and(end => {
setTimeout(() => {
console.log("并行4")
end();
}, 2000);
}).and(end => {
setTimeout(() => {
console.log("并行5")
end();
}, 2000);
}).next(end => {
setTimeout(() => {
console.log("串行3")
end();
}, 2000);
}).finish(() => {
setTimeout(() => {
console.log("结束")
}, 2000);
})
}
</script>
<template>
<div>
<button @click="run">运行</button>
<div>输出</div>
<div v-for="i in outout">
{{ i }}
</div>
</div>
</template>

2
packages/core/src/async/index.ts

@ -0,0 +1,2 @@
export * from "./asyncController"

2
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"

4
packages/core/src/utils/index.ts

@ -0,0 +1,4 @@
export function isArray(arr) {
return Array.isArray(arr)
}
Loading…
Cancel
Save