Skip to content

Do While 任务

Do While 是 Taskflow 中的高级控制流任务,实现了循环执行逻辑。它允许基于条件表达式重复执行一组任务,直到条件不再满足为止。这种任务特别适用于需要迭代处理的场景,如批量数据处理、分页API调用等。

核心特性

  1. 条件评估

    • 支持多种评估器类型
    • 灵活的条件表达式配置
    • 动态迭代控制
  2. 执行模式

    • 先执行后评估(do-while 语义)
    • 支持迭代计数和限制
    • 自动任务引用名称管理
  3. 数据处理

    • 支持列表迭代
    • 迭代状态维护
    • 完整的执行历史记录

任务参数

参数描述必需/可选
evaluatorType条件评估器类型: - value-param: 评估指定输入参数 - graaljs: 使用 ES6 兼容的 JavaScript 表达式必需
loopCondition循环继续条件: - value-param: 参数键名 - graaljs: JavaScript 条件表达式必需
loopOver循环体中要执行的任务列表必需
inputParameters.keepLastN保留最近 N 次迭代的结果。默认值为 2。设置为 0 表示保留所有迭代结果。可选
inputParameters.items用于列表迭代模式的数组。迭代次数等于数组长度。可选

执行语义

  1. 迭代命名规则

    • 任务引用名称格式:{taskReferenceName}__{iterationNumber}
    • 迭代编号从 1 开始递增
    • 失败重试时迭代从 1 重新开始
  2. 状态管理

    • 每次迭代的状态独立维护
    • 支持迭代间数据传递
    • 提供迭代计数器访问
  3. 条件评估

    • 每次迭代后进行条件检查
    • 支持复杂逻辑表达式
    • 可访问当前迭代状态

配置示例

基本配置

{
  "name": "do_while",
  "taskReferenceName": "do_while_ref",
  "type": "DO_WHILE",
  "inputParameters": {
    "value": "${workflow.input.value}"
  },
  "evaluatorType": "graaljs",
  "loopCondition": "(function(){ return $.value < 10; })();",
  "loopOver": [
    {
      "name": "http_task",
      "taskReferenceName": "http_task_ref",
      "type": "HTTP",
      "inputParameters": {
        "http_request": {
          "uri": "https://www.taskflow.cn/api",
          "method": "POST",
          "body": {
            "iteration": "${do_while_ref.output.iteration}"
          }
        }
      }
    }
  ]
}

列表迭代模式

{
  "name": "do_while",
  "taskReferenceName": "do_while_ref",
  "type": "DO_WHILE",
  "inputParameters": {
    "items": ["a", "b", "c"]
  },
  "evaluatorType": "value-param",
  "loopOver": [
    {
      "name": "process_item",
      "taskReferenceName": "process_item_ref",
      "type": "SIMPLE",
      "inputParameters": {
        "item": "${do_while_ref.output.item}"
      }
    }
  ]
}

最佳实践

  1. 性能优化

    • 使用 keepLastN 限制历史数据
    • 避免过于复杂的条件表达式
    • 合理设置迭代上限
  2. 错误处理

    • 实现适当的重试策略
    • 处理边界条件
    • 监控迭代计数
  3. 数据管理

    • 谨慎使用大型数据结构
    • 及时清理临时数据
    • 使用变量引用而非硬编码

使用限制

  1. 结构限制

    • 不支持嵌套 Do While
    • 分支任务需在循环范围内完成
    • 不支持隔离组执行
  2. 性能考虑

    • 建议限制最大迭代次数
    • 注意内存使用
    • 考虑任务超时设置

错误处理

  • 条件评估错误导致 FAILED_WITH_TERMINAL_ERROR
  • 迭代执行失败触发重试机制
  • 支持自定义错误处理策略

UI 配置指南

  1. 添加 Do While 任务
  2. 配置评估器类型和条件
  3. 添加循环体任务
  4. 设置迭代限制(可选)
  5. 配置错误处理策略

任务输出

Do While 任务将返回以下参数。

参数描述
iteration迭代次数。如果 Do While 任务正在进行中,iteration 将显示当前迭代编号。如果 Do While 任务已完成,iteration 将显示最终迭代次数。

此外,将为每次迭代创建一个对象,以其迭代编号(例如 1、2、3)为键,并包含所有循环任务的任务引用名称及其输出。

输出负载还可能包含 loopCondition 中存储的任何状态。例如,如果 loopCondition 是 if ($.LoopTask['iteration'] <= 10) {$.LoopTask.storage = 3; true } else {false},则 storage 将作为输出参数存在。

示例输出

{
  "1": {
    "taskA_ref": {
      "response": {
        "headers": {},
        "body": {},
        "statusCode": 200
      }
    },
    "taskB_ref": {
      //taskBOutput
    }
  },
  "2": {
    "taskA_ref": {
      "response": {
        "headers": {},
        "body": {},
        "statusCode": 200
      }
    },
    "taskB_ref": {
      //taskBOutput
    }
  },
  "iteration": 2
}

访问 Do While 任务输出

每次完成 do while 循环中的任务时,输出都会被保存并按迭代值索引。这使得条件可以使用 $.TaskName[’iteration’]['loopTask'] 检查特定任务迭代的输出,将 TaskName 替换为实际的 Do While 任务引用名称,将 loopTask 替换为循环任务引用名称。

在 UI 中添加 Do While 任务

添加 Do While 任务的步骤:

  1. 在工作流中,选择 (+) 图标并添加 Do While 任务。

  2. 在 Script params 中,添加将在表达式中评估的参数。

  3. 在 Loop condition 中,选择评估器类型并输入循环条件。

    • Value-Param—确保表达式值与您在 Script params 中定义的参数键匹配。
    • ECMASCRIPT—输入 JavaScript 脚本。
  4. 在工作流中,选择 (+) 图标以向 do while 循环添加任务。

  5. (可选)通过取消选中 No Limits 来设置所需的迭代次数。默认情况下,迭代次数没有限制。

TaskFlow Conductor 中的 Do While 任务截图

示例

以下是使用 Do While 任务的一些示例。

使用 `graaljs` 评估器

{
  "name": "do_while",
  "taskReferenceName": "do_while_ref",
  "inputParameters": {
    "number": "${workflow.input.qty}"
  },
  "type": "DO_WHILE",
  "loopCondition": "(function () {\n  if ($.do_while_ref['iteration'] < $.number) {\n    return true;\n  }\n  return false;\n})();",
  "loopOver": [
    {
      "name": "first task",
      "taskReferenceName": "first_task",
      "inputParameters": {
        "http_request": {
          "uri": "https://www.taskflow.cn/api",
          "method": "POST"
        }
      },
      "type": "HTTP"
    },
    {
      "name": "second task",
      "taskReferenceName": "second_task",
      "inputParameters": {
        "http_request": {
          "uri": "https://www.taskflow.cn/api",
          "method": "POST"
        }
      },
      "type": "HTTP"
    }
  ]
  "evaluatorType": "graaljs"
}

成功执行后,假设发生了三次迭代,上述 Do While 任务将产生以下执行 JSON:

{
  "taskType": "DO_WHILE",
  "outputData": {
    "iteration": 3,
    "1": {
      "first_task": {
        "response": {},
        "headers": {
          "Content-Type": "application/json"
        }
      },
      "second_task": {
        "response": {},
        "headers": {
          "Content-Type": "application/json"
        }
      }
    },
    "2": {
      "first_task": {
        "response": {},
        "headers": {
          "Content-Type": "application/json"
        }
      },
      "second_task": {
        "response": {},
        "headers": {
          "Content-Type": "application/json"
        }
      }
    },
    "3": {
      "first_task": {
        "response": {},
        "headers": {
          "Content-Type": "application/json"
        }
      },
      "second_task": {
        "response": {},
        "headers": {
          "Content-Type": "application/json"
        }
      }
    }
  }
}

在循环任务中使用迭代键

有时,您可能希望在循环任务中使用 Do While 迭代值/计数器。在此示例中,对 GitHub 存储库进行 API 调用以获取所有标星者,每次迭代都会增加分页。

Do While 任务的 taskReferenceName 是 "get_all_stars_loop_ref"。要评估当前迭代,在 loopCondition 中使用参数 $.get_all_stars_loop_ref['iteration']。在嵌入循环的 HTTP 任务中,使用 ${get_all_stars_loop_ref.output.iteration} 来定义 API 应返回的结果页面。

{
  "name": "get_all_stars",
  "taskReferenceName": "get_all_stars_loop_ref",
  "inputParameters": {
    "stargazers": "4000"
  },
  "type": "DO_WHILE",
  "loopCondition": "if ($.get_all_stars_loop_ref['iteration'] < Math.ceil($.stargazers/100)) { true; } else { false; }",
  "loopOver": [
    {
      "name": "100_stargazers",
      "taskReferenceName": "hundred_stargazers_ref",
      "inputParameters": {
        "counter": "${get_all_stars_loop_ref.output.iteration}",
        "http_request": {
          "uri": "https://www.taskflow.cn/api",
          "method": "GET",
          "headers": {
            "Authorization": "token ${workflow.input.gh_token}",
            "Accept": "application/vnd.github.v3.star+json"
          }
        }
      },
      "type": "HTTP"
    }
  ]
}

迭代项目列表

可以迭代项目列表。要迭代列表,Do-While 任务必须有一个专门命名为 'items' 的输入参数,其中包含要处理的集合。参数名称 'items' 是必需的,不能替换为其他名称。

迭代次数将等于列表大小。如果 "items"=["a","b","c"],循环任务将执行三次;如果 "items"=[],Do While 任务将被标记为完成而不执行循环任务。

列表中的每个项目都使用 ${do_while_ref.output.item} 传递到循环任务的每次迭代中。

{
  "name": "do_while",
  "taskReferenceName": "do_while_ref",
  "inputParameters": {
    "items": ["a", "b", "c"]
  },
  "type": "DO_WHILE",
  "loopCondition": "",
  "loopOver": [
    {
      "name": "http",
      "taskReferenceName": "http_ref",
      "inputParameters": {
        "uri": "https://www.taskflow.cn/api",
        "method": "GET",
        "accept": "application/json",
        "contentType": "application/json",
        "encode": true,
        "body": {
          "item": "${do_while_ref.output.item}"
        },
        "headers": {}
      },
      "type": "HTTP"
    }
  ],
  "evaluatorType": "value-param"
}

限制

Do While 任务有几个限制:

  • 分支—在 Do While 任务中,支持使用 Switch、Fork/Join、Dynamic Fork 任务进行分支。但是,如果分支超出其范围,Do While 任务可能不会按预期执行,因为循环任务将在范围内执行。
  • 嵌套循环—不支持嵌套的 Do While 任务。要实现类似于嵌套 do while 循环的功能,可以在 Do While 任务中使用子工作流任务。
  • 隔离组执行—不支持隔离组执行。但是,Do While 任务中的循环任务支持域。

错误

如果在评估 loopCondition 期间发生异常,任务将设置为 FAILED_WITH_TERMINAL_ERROR

飞流云