本文介绍了选择步骤的基本知识和其相关使用示例,以及条件表达式的相关内容。

介绍

选择(Choice)步骤让流程根据条件执行不同步骤,类似于编程语言中的 switch-case,它包含多个条件选项(Choice)和一个默认选项(Default),每个条件选项带有一个条件表达式(Condition),若干步骤(Steps)和跳转指令(Goto)。默认选项只带有若干步骤和跳转指令。当流程执行到选择步骤,系统会按照选项定义的顺序依次评估其条件表达式是否返回 True

  • 如果返回 True 则执行选项对应的步骤(如果定义了步骤),然后执行跳转(如果定义跳转指令)。
  • 如果没有任何选项返回 True,则执行默认选项对应的步骤和跳转。
  • 如果没有定义默认选项,则结束选择步骤。

选择步骤包含以下属性:

  • type(必需):choice,表示该步骤是选择步骤。
  • name(必需):步骤名称。
  • choices(必需): 多个选项,数组类型,每个元素对应一个选项。
    • condition(必需):定义条件表达式。条件表达式可以通过 JSON Path ($.key) 引用步骤输入数据。
    • steps(可选):定义了选项所对应的多个串行步骤。
    • goto(可选):指定跳转目的步骤名称,该目的步骤只能是和选择步骤并列的一个步骤。
  • default(必需):默认选项。
    • steps(可选):定义了选项所对应的多个串行步骤。
    • goto(可选):指定跳转目的步骤名称,该目的步骤只能是和当前选择步骤并列的一个步骤。
  • end(可选):当前步骤结束后是否继续执行其后定义的步骤。
  • inputMappings(可选):输入映射。
  • outputMappings(可选):输出映射。本步骤 $local 为实际执行选择分支的执行结果。
    说明 如果未指定输出映射,本步骤默认将 $local 作为输出。

示例

下面的流程定义了一个选择步骤。

  • 如果输入中的 status 的值是 ready,则会执行第一个条件选项的步骤 pass1,然后执行 pass3final
  • 如果输入中的 status 的值是 failed,则会执行第二个条件选项的跳转,结束选择步骤,执行 final
  • 如果输入中的 status 的值不是 readyfailed,则会执行默认选项逻辑, 即 pass2final
version: v1
type: flow
steps:
  - type: choice
    name: mychoice
    choices:
      - condition: $.status == "ready"
        # choice with steps
        steps:
          - type: pass
            name: pass1
      - condition: $.status == "failed"
        # choice with goto
        goto: final
    default:
      # choice with both steps and goto
      steps:
        - type: pass
          name: pass2
      goto: final
  - type: pass
    name: pass3
  - type: pass
    name: final            

条件表达式

条件表达式由以下操作和变量组成:

  • 比较操作:>>=<<===!=,适用于字符串和数字类型。
  • 逻辑操作:||&&
  • 字符常量:以双引号或者反引号开始和结束,例如 "foobar" 或者 `foobar`。
  • 数字常量:112.5
  • 布尔常量:truefalse
  • 前缀:!-
  • 包含:in,用来判断数组是否包含某个值,或者对象是否包含某个键值。

以下示例对于下面的步骤输入,针对不同的条件表达式,显示了相应的执行结果。

{
  "a": 1,
  "b": {
    "b1": true,
    "b2": "ready"
  },
  "c": [1, 2, 3],
  "d": 1,
  "e": 1,
  "f": {
    "f1": false,
    "f2": "inprogress"
  }
}           
条件表达式 执行结果
$.a == 1 true
$.a==1 true
$.a == 2 false
$.a > 0 true
0 < $.a true
$.a >= 1 true
$.a != 2 true
$.b.b1 true
$.b.b1 == true true
$.b.b1 == false false
$.b.b2 == "ready" true
$.b.b2 == `ready` true
$.b.b2 == "inprogress" false
$.a == 1 && $.b.b1 true
$.a == 1 || $.b.b1 true
$.a == 2 && $.b.b1 false
$.a == 2 || $.b.b1 true
$.c[0] == 1 true
$.c[0] == $.a true