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