You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);

关键修改说明

  1. 修复语法错误:修正了对象结构中的冗余代码、错误的标点符号,确保代码能正常解析运行。
  2. 添加重复判断:通过!completedJobs.includes(currentTask.taskName)检查当前任务是否未完成,只有满足条件才推送到队列。
  3. 优化依赖检查:将依赖的every判断移到循环外,避免同一个任务被重复推送;仅当所有依赖都完成且当前任务未完成时,才添加到队列。

运行这段代码后,workflowTaskQueue会只包含detailsConfirmed任务(它的依赖insertDetails已完成,且自身未在completedJobs中),完全符合你的需求。

内容的提问来源于stack exchange,提问作者jjlittle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 23:22:41