feat(task): 支持后置任务执行机制

- 新增后置任务注册方法 registerPostTask
- 修改主任务注册方法支持后置任务配置
- 更新任务执行逻辑以支持前置->主->后置的完整流程
- 优化任务依赖收集算法以正确处理后置任务
- 完善文档注释说明新的使用方式
- 添加完整的使用示例展示前后置任务配合
- 改进错误处理和日志输出信息
- 增加获取所有任务、移除任务等辅助方法说明
This commit is contained in:
hz
2025-11-26 11:42:50 +08:00
parent 02bfc5dac6
commit 83ca541470

View File

@@ -1,6 +1,9 @@
/**
* 任务管理系统
* 用于注册和执行主任务及其前置子任务
* 用于注册和执行主任务前置子任务和后置子任务
*
* 执行顺序:前置任务 -> 主任务 -> 后置任务
* 如果任何任务返回 false 或抛出错误,后续任务将不会执行
*
* 使用方法:
*
@@ -10,28 +13,60 @@
* import { createTaskContainer } from '@/views/ebiz/saleFlowProImprove/js/task.js';
* const myTaskContainer = createTaskContainer();
*
* 2. 注册前置任务:
* 2. 注册前置任务(在主任务之前执行):
* taskContainer.registerPreTask('validateForm', () => {
* console.log('验证表单数据');
* return true; // false 表示失败
* return true; // 返回 false 表示任务失败,后续任务不会执行
* });
*
* 3. 注册主任务:
* 3. 注册后置任务(在主任务之后执行):
* taskContainer.registerPostTask('logResult', (mainTaskResult) => {
* console.log('记录执行结果:', mainTaskResult);
* return true; // 返回 false 表示任务失败
* });
*
* 4. 注册主任务:
* // 基本用法
* taskContainer.registerMainTask('submitForm', () => {
* console.log('提交表单');
* return true; // 或 false 表示失败
* }, ['validateForm']); // 指定前置任务
* return { success: true, data: '提交成功' }; // 返回结果会传递给后置任务
* }, ['validateForm']); // 第二个参数是前置任务数组
*
* 4. 执行任务:
* // 完整用法(带前置和后置任务
* taskContainer.registerMainTask(
* 'processOrder',
* () => {
* console.log('处理订单');
* return { orderId: '12345', status: 'processing' };
* },
* ['validateOrder'], // 前置任务
* ['updateInventory', 'sendConfirmation'] // 后置任务
* );
*
* 5. 执行任务:
* async function handleSubmit() {
* const result = await taskContainer.executeTask('submitForm');
* if (result.success) {
* console.log('所有任务执行成功:', result.results);
* } else {
* console.log(`任务执行失败,失败的任务: ${result.failedTask}`);
* try {
* const result = await taskContainer.executeTask('submitForm');
* if (result.success) {
* console.log('所有任务执行成功:', result.results);
* } else {
* console.log(`任务执行失败,失败的任务: ${result.failedTask}`);
* }
* } catch (error) {
* console.error('任务执行出错:', error);
* }
* }
*
* 6. 其他方法:
* // 获取所有已注册的任务
* const allTasks = taskContainer.getAllTasks();
*
* // 移除指定任务
* taskContainer.removeTask('taskId');
*
* // 清除所有任务
* taskContainer.clearAllTasks();
*
* @module TaskContainer
*/
@@ -48,8 +83,9 @@ function createTaskContainer() {
* @param {string} taskId - 任务唯一标识
* @param {Function} taskFn - 任务执行函数
* @param {Array<string>} preTasks - 前置任务ID列表
* @param {Array<string>} postTasks - 后置任务ID列表
*/
function registerMainTask(taskId, taskFn, preTasks = []) {
function registerMainTask(taskId, taskFn, preTasks = [], postTasks = []) {
if (typeof taskFn !== 'function') {
throw new Error(`Task ${taskId} must be a function`)
}
@@ -58,7 +94,8 @@ function createTaskContainer() {
tasks.set(taskId, {
id: taskId,
fn: taskFn,
preTasks: preTasks,
preTasks: preTasks || [],
postTasks: postTasks || [],
isMainTask: true
})
}
@@ -81,13 +118,34 @@ function createTaskContainer() {
})
}
/**
* 注册一个后置任务
* @param {string} taskId - 任务唯一标识
* @param {Function} taskFn - 任务执行函数
*/
function registerPostTask(taskId, taskFn) {
if (typeof taskFn !== 'function') {
throw new Error(`Post-task ${taskId} must be a function`)
}
console.log(`🔹 后置任务 ${taskId} 注册成功`)
tasks.set(taskId, {
id: taskId,
fn: taskFn,
preTasks: [],
postTasks: [],
isMainTask: false,
isPostTask: true
})
}
/**
* 收集任务依赖关系,返回按执行顺序排列的任务列表
* @param {string} taskId - 任务ID
* @param {Array} visited - 已访问的任务(防止循环依赖)
* @param {boolean} collectPostTasks - 是否收集后置任务
* @returns {Array} 按执行顺序排列的任务列表
*/
function collectDependencies(taskId, visited = []) {
function collectDependencies(taskId, visited = [], collectPostTasks = true) {
const task = tasks.get(taskId)
if (!task) {
throw new Error(`Task ${taskId} not found`)
@@ -104,14 +162,24 @@ function createTaskContainer() {
// 先收集前置任务
for (const preTaskId of task.preTasks) {
orderedTasks = [...orderedTasks, ...collectDependencies(preTaskId, [...visited])]
orderedTasks = [...orderedTasks, ...collectDependencies(preTaskId, [...visited], false)]
}
// 去重并确保当前任务只添加一次
// 添加当前任务
if (!orderedTasks.find(t => t.id === taskId)) {
orderedTasks.push(task)
}
// 收集后置任务
if (collectPostTasks && task.preTasks && task.preTasks.length > 0) {
for (const postTaskId of task.preTasks) {
const postTask = tasks.get(postTaskId)
if (postTask) {
orderedTasks.push(postTask)
}
}
}
return orderedTasks
}
@@ -137,9 +205,24 @@ function createTaskContainer() {
// 按顺序执行任务
const results = {}
let mainTaskResult = null
for (const task of tasksToExecute) {
try {
const taskResult = await Promise.resolve(task.fn())
let taskResult
// 如果是后置任务,将主任务的结果传递给它
if (task.isPostTask) {
taskResult = await Promise.resolve(task.fn(mainTaskResult))
} else {
taskResult = await Promise.resolve(task.fn())
// 保存主任务的结果,供后置任务使用
if (task.isMainTask) {
mainTaskResult = taskResult
}
}
results[task.id] = taskResult
// 检查任务执行结果如果为false则中断执行
@@ -181,7 +264,7 @@ function createTaskContainer() {
}
tasks.delete(taskId)
console.log(`Task ${taskId} removed successfully`)
console.log(`任务 ${taskId} 已经成功移除`)
return true
}
/**
@@ -195,6 +278,7 @@ function createTaskContainer() {
return {
registerMainTask,
registerPreTask,
registerPostTask,
executeTask,
getAllTasks,
removeTask,