mirror of
http://112.124.100.131/GFRS/ebiz-h5.git
synced 2025-12-09 16:56:43 +08:00
feat(task): 支持后置任务执行机制
- 新增后置任务注册方法 registerPostTask - 修改主任务注册方法支持后置任务配置 - 更新任务执行逻辑以支持前置->主->后置的完整流程 - 优化任务依赖收集算法以正确处理后置任务 - 完善文档注释说明新的使用方式 - 添加完整的使用示例展示前后置任务配合 - 改进错误处理和日志输出信息 - 增加获取所有任务、移除任务等辅助方法说明
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user