JavaScript基础工作流引擎开发问题:如何避免向输出数组推送已存在元素
问题:如何避免重复将已完成的任务添加到工作流任务队列?
我正在开发一款基础工作流引擎,目前已经实现了检查配置文件依赖并执行后续函数的逻辑,但现在遇到一个问题:我需要判断目标元素对应的taskName是否已存在于completedJobs数组中,只有当该元素不存在时,才将其推送到workflowTaskQueue输出数组。我尝试用.includes()和.indexOf()方法实现这个判断,但逻辑没有生效。
以下是我的相关代码:
const TestWorkflowConfig = { insertDetails: { dependencies: [], workflow: { name: "updateRow", id: 10 }, description: "This is a test function where details need to be entered (row update)", data: {}, taskName: "insertDetails", }, detailsConfirmed: { { insertDetails: { isRequired: true; } } dependencies: ["insertDetails"], workflow: { name: "updateRow", id: 10; }, description: "this is to confirm details (update row status)", data: {}, taskName: "detailsConfirmed", }, sendConfirmationEmail: { dependencies: ["detailsConfirmed"], workflow: { name: "sendEmail", id: 8; }, description: "this is a test email to send out to confirm details (send email workflow)", data: { name: "james", email: "james@email.com", body: "this is a test email please ignore";; }, taskName: "sendConfirmationEmail", }, }; const taskQueue = [ { "processName": "sendConfirmationEmail", "isComplete": false }, { "processName": "detailsConfirmed", "isComplete": false }, { "processName": "insertDetails", "isComplete": true } ]; const workflowTaskQueue = []; const config = TestWorkflowConfig; const completedJobs = []; for (const element of taskQueue) { if (element.isComplete === true) { completedJobs.push(element.processName); } } for (const element in config) { if (config[element].dependencies <= 0) { // 我想要检查config[element]的taskName是否在completedJobs数组中,仅当不存在时才推送 workflowTaskQueue.push({ json: config[element] }); } else { const dependencies = config[element].dependencies; const dep = []; for (const el of dependencies) { dep.push(el); const result = dep.every((i) => completedJobs.includes(i)); if (result === true) { // 同样我想要检查config[element]的taskName是否在completedJobs数组中,仅当不存在时才推送 workflowTaskQueue.push({ json: config[element] }); } } } } console.log("taskQueue: " + taskQueue); console.log("completedJobs: " + completedJobs); console.log("output:" + workflowTaskQueue);
问题分析与解决方案
首先你的代码存在语法错误,这是导致逻辑无法生效的首要原因:
detailsConfirmed字段里多余了一段{ insertDetails: { isRequired: true; } },破坏了对象结构- 对象属性分隔应使用逗号而非分号(比如
workflow: { name: "updateRow", id: 10; }里的分号需改为逗号) sendConfirmationEmail的data字段中body值后多了两个分号
其次,核心的重复判断逻辑完全缺失——你在两个推送任务的分支里都没有检查taskName是否存在于completedJobs,同时依赖检查的循环会导致同一个任务被重复推送多次。
修复后的完整代码
// 修正语法错误后的工作流配置 const TestWorkflowConfig = { insertDetails: { dependencies: [], workflow: { name: "updateRow", id: 10 }, description: "This is a test function where details need to be entered (row update)", data: {}, taskName: "insertDetails", }, detailsConfirmed: { dependencies: ["insertDetails"], workflow: { name: "updateRow", id: 10 }, description: "this is to confirm details (update row status)", data: {}, taskName: "detailsConfirmed", }, sendConfirmationEmail: { dependencies: ["detailsConfirmed"], workflow: { name: "sendEmail", id: 8 }, description: "this is a test email to send out to confirm details (send email workflow)", data: { name: "james", email: "james@email.com", body: "this is a test email please ignore" }, taskName: "sendConfirmationEmail", }, }; const taskQueue = [ { "processName": "sendConfirmationEmail", "isComplete": false }, { "processName": "detailsConfirmed", "isComplete": false }, { "processName": "insertDetails", "isComplete": true } ]; const workflowTaskQueue = []; const config = TestWorkflowConfig; const completedJobs = []; // 收集已完成的任务名称 for (const element of taskQueue) { if (element.isComplete === true) { completedJobs.push(element.processName); } } // 处理工作流任务,添加重复判断逻辑 for (const element in config) { const currentTask = config[element]; // 核心判断:当前任务未被标记为已完成 const isTaskNotCompleted = !completedJobs.includes(currentTask.taskName); if (currentTask.dependencies.length <= 0) { // 无依赖任务:仅当未完成时推送 if (isTaskNotCompleted) { workflowTaskQueue.push({ json: currentTask }); } } else { // 有依赖任务:先检查所有依赖是否都已完成 const allDependenciesMet = currentTask.dependencies.every(dep => completedJobs.includes(dep)); // 依赖全部完成且当前任务未完成时,才推送 if (allDependenciesMet && isTaskNotCompleted) { workflowTaskQueue.push({ json: currentTask }); } } } console.log("taskQueue:", taskQueue); console.log("completedJobs:", completedJobs); console.log("output:", workflowTaskQueue);
关键修改说明
- 修复语法错误:修正了对象结构中的冗余代码、错误的标点符号,确保代码能正常解析运行。
- 添加重复判断:通过
!completedJobs.includes(currentTask.taskName)检查当前任务是否未完成,只有满足条件才推送到队列。 - 优化依赖检查:将依赖的
every判断移到循环外,避免同一个任务被重复推送;仅当所有依赖都完成且当前任务未完成时,才添加到队列。
运行这段代码后,workflowTaskQueue会只包含detailsConfirmed任务(它的依赖insertDetails已完成,且自身未在completedJobs中),完全符合你的需求。
内容的提问来源于stack exchange,提问作者jjlittle
相关产品推荐
相关产品推荐

