选择(Choice)

选择(Choice)状态用于根据特定的条件或逻辑判断来决定流程的下一步走向。本文介绍选择状态的基本概念及其相关使用示例,以及条件表达式的相关内容,帮助您更好地理解选择状态在流程控制中的作用。

基本概念

选择(Choice)状态是一个特定的流程节点,让流程根据条件执行不同的状态。它包含多个条件选项(Choice)和一个默认选项(Default),每个条件选项带有一个条件表达式(Condition)和跳转指令(Next)。类似于编程语言中的switch-case,通过条件表达式来决定流程的执行路径。

系统会按照选项定义的顺序依次评估其条件表达式是否返回True

  • 如果某选项返回True,则执行选项对应的状态(如果定义了状态),然后执行跳转(如果定义跳转指令)。

  • 如果没有任何选项返回True,则执行默认选项对应的状态和跳转。

选择状态包含以下属性。

字段

类型

是否必选

描述

示例值

Name

string

状态名称。

my state

Description

string

状态描述。

describe it here

Type

string

状态类型。

Choice

InputConstructor

map[string]any

输入构造器。

请参见输入和输出

Default

string

默认分支。

my next task

Branches

ChoiceBranch

分支列表。

请参见ChoiceBranch

ChoiceBranch

字段

类型

是否必选

描述

示例值

Condition

string

条件表达式。如果有不理解,请参见表达式示例

$Input.status=="ready"

Next

string

指向节点名称。

my next task

重要

Choice状态不支持End属性和Next属性,通过Default属性表示所有选择条件都不满足时的默认指向状态,作用同Next,但在Branches中支持Next属性。

使用示例

以下示例定义一个选择状态。

  • 如果输入中的status的值是ready,则会执行第一个条件选项的状态Pass2

  • 如果输入中的status的值不是ready,则会执行默认选项逻辑,即Pass1

Type: StateMachine
Name: MyWorkflow
SpecVersion: v1
StartAt: Choice
States:
  - Type: Choice
    Name: Choice
    Branches:
      - Condition: $Input.data == "ready"
        Next: Pass1
    Default: Pass2
  - Type: Pass
    Name: Pass2
    End: true
  - Type: Pass
    Name: Pass1
    End: true

条件表达式

当前系统支持的条件表达式由以下操作和变量组成,执行后返回Bool值即可达成条件:

  • 比较操作:>>=<<===!=,适用于字符串和数字类型。

  • 逻辑操作:||&&

  • 字符常量:以双引号("")或者反引号(``)开始和结束,例如"foobar"或者`foobar`。

  • 数字常量:112.5

  • 布尔常量:truefalse

  • 前缀:!-

  • 包含:in,用来判断数组是否包含某个值,或者对象是否包含某个键值。

表达式示例

以下示例对于下面的状态输入$Input,针对不同的条件表达式,显示了不同的执行结果。Condition可以使用的上下文表达式变量为$Context$Input。更多信息,请参见数据传递

{
	"a": 1,
	"b": {
		"b1": true,
		"b2": "ready"
	},
	"c": [1, 2, 3],
	"d": 1,
	"e": 1,
	"f": {
		"f1": false,
		"f2": "inprogress"
	}
}

条件表达式

执行结果

$Input.a==1

true

$Input.a==2

false

$Input.a>0

true

0<$Input.a

true

$Input.a>=1

true

$Input.a!=2

true

$Input.b.b1

true

$Input.b.b1==true

true

$Input.b.b1==false

false

$Input.b.b2=="ready"

true

$Input.b.b2=="inprogress"

false

$Input.a==1 && $Input.b.b1

true

$Input.a==2 && $Input.b.b1

false

$Input.c[0]==1

true

$Input.c[0]==$Input.a

true

"f1" in $Input.f

true

"f3" in $Input.f

false

1 in $Input.c

true