选择步骤

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

参数说明

选择(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==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