全部产品
Search
文档中心

云工作流:选择(Choice)

更新时间:Apr 22, 2024

本文介绍选择状态的基本概念及其相关使用示例,以及条件表达式的相关内容。

基本概念

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

系统会按照选项定义的顺序依次评估其条件表达式是否返回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: my-wkfl
SpecVersion: v1
StartAt: Choice1
States:
  - Type: Choice
    Name: Choice1
    Branches:
      - Condition:$Input.status=="ready"
        Next: Pass2
    Default: Pass1
  - Type: Pass
    Name: Pass1
    End: true
  - Type: Pass
    Name: Pass2
    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