Skip to content
导航栏

流程控制

数据流用来编排处理器的调用逻辑,支持使用 flows对查询节点数据处理,JS数据流处理适用于较为复杂的业务逻辑。

flows处理器为我们提供完整的数据流处理,可以提供数据处理器一套流程, 数据流可以作为处理器使用,命名空间为 flows.<处理器名称>查询节点可以引用除自身以外的其他数据流。

上下文数据引用

  • 可在全局使用 {{$in}} 变量访问调用时的传入参数;
  • 可在全局使用 {{$res}} 变量访问各点返回值;
  • 可在节点使用 {{$out}} 变量访问处理器返回值; outs 用于字段声明当前节点的返回值, 如不声明返回处理器的运行结果。
  • output 字段用于声明数据流的输出结果, 如不声明返回所有节点的运行结果。
变量类型说明使用范围示例
{{$in}}array<any>作为处理器被调用时传入的参数表, 支持使用数组下标访问指定参数, 例如: {{$in.0}} 第 1 个参数, {{$in.1}} 第 2 个参数,nodes[*].args, nodes[*].outs, output{{$in}}, {{$in.0}},{{$in.0.name}}
{{$res}}[key:string]:any查询节点返回值(nodes[*].outs) 映射表, 支持使用查询节点名称访问特定查询节点返回值。例如 {{$res.node1.0}} node1 的第一返回值。nodes[*].args, nodes[*].outs, output{{$res}}, {{$res.node1.0.name}}, {{$res.node2.manu_id}}
{{$out}}any查询节点的处理器(process)返回值,支持使用 . 访问 Object /Array 数值nodes[*].outs{{out}}, {{out.name}}, {{out.0}}

内置的流程控制处理器

处理器别名说明
xiang.flow.Forxiang.helper.For遍历数据
xiang.flow.Eachxiang.helper.Each遍历数据
xiang.flow.Casexiang.helper.CaseCase 流程控制
xiang.flow.IFxiang.helper.IFIF 流程控制
xiang.flow.Returnxiang.helper.Return返回输入数据
xiang.flow.Throwxiang.helper.Throw抛出异常并结束程序

示例代码:

Case 流程控制示例

以下示例展示了如何使用 Case 流程控制进行条件判断,包括单条件和多条件 OR 逻辑的使用场景:

json
{
  "label": "Case流程控制示例",
  "version": "1.0.0",
  "description": "演示Case流程控制的使用方法",
  "nodes": [
    {
      "name": "条件判断",
      "process": "xiang.flow.Case",
      "args": [
        {
          "name": "多条件OR逻辑",
          "when": [
            { "用户": "张三", "=": "李四" },
            { "or": true, "用户": "李四", "=": "李四" }
          ],
          "process": "flows.处理A",
          "args": ["world"]
        },
        {
          "name": "单条件判断",
          "when": [{ "用户": "张三", "=": "张三" }],
          "process": "flows.处理B",
          "args": ["foo"]
        }
      ]
    }
  ]
}

在上面的示例中:

  1. 第一个条件判断使用了 OR 逻辑:

    • 检查 用户 是否等于 李四
    • 或者检查 用户 是否等于 李四
    • 如果任一条件满足,则执行 flows.处理A
  2. 第二个条件判断使用了单一条件:

    • 检查 用户 是否等于 张三
    • 如果条件满足,则执行 flows.处理B

条件判断会按顺序执行,当遇到第一个条件满足时,将执行对应的处理器并返回结果。

flows里面使用 xiang.flow.IF

json
{
  "label": "测试flows",
  "version": "1.0.0",
  "description": "测试flows",
  "nodes": [
    {
      "name": "检查数据",
      "process": "xiang.flow.IF",
      "args": [
        {
          "name": "忽略处理",
          "when": [{ "忽略处理": "{{$res}}", "is": "notnull" }],
          "process": "xiang.flow.Throw",
          "args": ["忽略处理", 400]
        }
      ]
    }
  ]
}

IF 流程控制示例

以下示例展示了如何使用 IF 流程控制进行条件判断,包括单条件和多条件 OR 逻辑的使用场景:

json
{
  "label": "IF流程控制示例",
  "version": "1.0.0",
  "description": "演示IF流程控制的使用方法",
  "nodes": [
    {
      "name": "条件判断",
      "process": "xiang.flow.IF",
      "args": [
        {
          "name": "多条件OR逻辑",
          "when": [
            { "用户": "张三", "=": "李四" },
            { "or": true, "用户": "李四", "=": "李四" }
          ],
          "process": "flows.处理A",
          "args": ["world"]
        },
        {
          "name": "单条件判断",
          "when": [{ "用户": "张三", "=": "张三" }],
          "process": "flows.处理B",
          "args": ["foo"]
        }
      ]
    }
  ]
}

在上面的示例中:

  1. 第一个条件判断使用了 OR 逻辑:

    • 检查 用户 是否等于 李四
    • 或者检查 用户 是否等于 李四
    • 如果任一条件满足,则执行 flows.处理A
  2. 第二个条件判断使用了单一条件:

    • 检查 用户 是否等于 张三
    • 如果条件满足,则执行 flows.处理B

条件判断会按顺序执行,当遇到第一个条件满足时,将执行对应的处理器并返回结果。

Each 流程控制示例

Each 流程控制支持以下数据类型的遍历:

  1. 整数类型(int、uint 及其变体):将遍历从 0 到该数值的范围
  2. 数组/切片类型:遍历数组中的每个元素
  3. Map 类型:遍历映射中的键值对
  4. 结构体类型:将结构体转换为 Map 后遍历其字段

以下示例展示了不同数据类型的遍历用法:

json
{
  "label": "Each流程控制示例",
  "version": "1.0.0",
  "description": "演示Each流程控制的使用方法",
  "nodes": [
    {
      "name": "遍历整数范围",
      "process": "xiang.flow.Each",
      "args": [
        5,
        {
          "process": "flows.处理数值",
          "args": ["::key", "::value"]
        }
      ]
    },
    {
      "name": "遍历数组",
      "process": "xiang.flow.Each",
      "args": [
        ["A", "B", "C", "D"],
        {
          "process": "flows.处理数组元素",
          "args": ["::key", "::value"]
        }
      ]
    },
    {
      "name": "遍历对象",
      "process": "xiang.flow.Each",
      "args": [
        {
          "name": "张三",
          "age": 18,
          "city": "北京"
        },
        {
          "process": "flows.处理对象属性",
          "args": ["::key", "::value"]
        }
      ]
    },
    {
      "name": "遍历结构体",
      "process": "xiang.flow.Each",
      "args": [
        {
          "ID": 1,
          "Name": "产品A",
          "Price": 99.9,
          "Status": "active"
        },
        {
          "process": "flows.处理结构体字段",
          "args": ["::key", "::value"]
        }
      ]
    }
  ]
}

在上面的示例中:

  1. 遍历整数范围示例:

    • 遍历从 0 到 4 的整数范围
    • 对每个数值调用 flows.处理数值 处理器
    • ::key 和 ::value 都是当前的遍历数值
  2. 遍历数组示例:

    • 遍历一个字符串数组 ["A", "B", "C", "D"]
    • 对每个元素调用 flows.处理数组元素 处理器
    • ::key 为当前索引,::value 为当前元素值
  3. 遍历对象示例:

    • 遍历一个包含用户信息的对象
    • 对每个属性调用 flows.处理对象属性 处理器
    • ::key 为属性名,::value 为属性值
  4. 遍历结构体示例:

    • 结构体会被转换为 Map 后进行遍历
    • 对每个字段调用 flows.处理结构体字段 处理器
    • ::key 为字段名,::value 为字段值

For 流程控制示例

以下示例展示了如何使用 For 流程控制进行数值范围遍历:

json
{
  "label": "For流程控制示例",
  "version": "1.0.0",
  "description": "演示For流程控制的使用方法",
  "nodes": [
    {
      "name": "数值遍历",
      "process": "xiang.flow.For",
      "args": [
        0,
        5,
        {
          "process": "flows.处理数值",
          "args": ["::key", "::value"]
        }
      ]
    }
  ],
  "output": {
    "示例说明": "For流程控制会遍历从0到4(不包含5)的数值",
    "遍历变量": {
      "key": "当前遍历的索引值,如0,1,2,3,4",
      "value": "与key相同,值为当前遍历的索引值"
    }
  }
}

在上面的示例中:

  1. For 流程控制接收三个参数:

    • 第一个参数:起始值(包含)
    • 第二个参数:结束值(不包含)
    • 第三个参数:处理器配置
  2. 示例将遍历 0 到 4 的数值:

    • ::key::value 都是当前的遍历索引值
    • 对每个数值调用 flows.处理数值 处理器
    • 处理器会收到两个相同的参数,例如当遍历到 2 时,两个参数都是 2
  3. 实际应用场景:

    • 批量处理固定数量的任务
    • 生成指定范围的数值序列
    • 执行特定次数的操作