使用控制操作改变控制流
控制操作可帮助逻辑应用工作流做出决策。 社交媒体监视应用将使用控制操作来测试推文的情绪分数,并根据推文是正面情绪还是负面情绪来分支工作流路径。 在本单元中,我们将介绍协助管理工作流执行路径的四个控制操作。 我们还将讨论如何使用工作流设计器添加和配置控制操作。
条件操作
Condition 控制操作是一个 if 语句,可根据正在处理的数据将工作流分为两个路径。 此操作包含一个布尔表达式和两项操作。 在运行时,执行引擎会根据表达式是 true 还是 false 来计算表达式并选择操作。
例如,你可能希望根据金额将费用报表发送给其他管理人员。 如果你正在处理一封电子邮件,则可能需要测试它是否被标记为高优先级。 在我们的社交媒体监视应用中,我们将使用 Condition 语句根据推文的情绪分数进行分支。 下图显示工作流如何使用 Condition 控制操作。
类型和运算符
可在 condition 控制操作中测试数值、字符串、布尔值和 JSON 对象。 以下伪代码显示了每种简单类型的一个示例:
if (score is-greater-than 0.7) ... // Numeric
if (TweetedBy does-not-contain "MyCompany") ... // String
if (Favorited is-equal-to true) ... // Boolean
每种类型都有一组可在比较中使用的运算符。 下表列出了每种类型的运算符:
数值 | 字符串 | 布尔 | JSON 对象 |
---|---|---|---|
is-equal-to | is-equal-to | is-equal-to | is-equal-to |
is-not-equal-to | is-not-equal-to | is-not-equal-to | is-not-equal-to |
is-greater-than | contains | ||
is-greater-than-or-equal-to | does-not-contain | ||
is-less-than | starts-with | ||
is-less-than-or-equal-to | does-not-start-with | ||
ends-with | |||
does-not-end-with |
大多数操作都很直观,但有两种情况值得一提:
- 字符串比较区分大小写。
- JSON 比较使用所谓的深度比较。 这种比较意味着相等运算符将比较整个对象,包括复杂对象中的任何后代标记。
使用 AND 和 OR 组合表达式
Azure 逻辑应用可使你通过使用 AND 或 OR 组合条件来创建复杂表达式。 假设想要识别中性情绪的推文(接近 0.5 的分数表示中性情绪)。 可编写类似于以下伪代码的表达式:
if (score is-greater-than 0.4 AND score is-less-than 0.6)
数据可用性
Azure 逻辑应用使所有先前步骤的数据在后续步骤中都可用。 此功能意味着表达式可以使用前面任何步骤生成的值。 甚至可以在一个表达式中组合来自不同步骤的值。 例如,以下伪代码查找不是由你的公司发送的带有正面情绪的推文。 请注意,评分来自“检测情绪”操作,而 TweetedBy 值来自“发布新推文时”触发器。
if (score is-greater-than 0.7 AND TweetedBy does-not-contain "MyCompany")
使用组创建复杂表达式
假设要构建一个表达式来识别有影响力的推文。 你决定有两个符合条件的标准:
- 情绪分数大于 0.9 且推文已被标记为收藏。
- 转推数大于 1000 次。
你想构建一个类似于以下伪代码的表达式来捕获该想法:
if (score is-greater-than 0.9 AND Favorited is-equal-to true OR RetweetCount is-greater-than 1000) // Error, cannot mix AND and OR
Azure 逻辑应用间接支持此表达式,你可以使用称为组的功能来启用此支持。 组是与 AND 或 OR 组合的表达式序列。 不能在组中混合 AND 和 OR。
让我们看一些表示为伪代码的示例。 为了便于阅读示例,我们将使用小写字母表示需要组合的表达式。 下面的第一个示例是合法的组,但第二个不合法:
if (a AND b AND c) // OK
if (a AND b OR c) // Error, cannot mix AND and OR
相反,你必须为前面示例中由 AND 连接的表达式创建一个组。 然后,使用 OR 将组连接到另一个表达式。 我们在下面的伪代码中使用括号来表示一个组:
if ([a AND b] OR c) // OK
Switch 操作
Switch 控制操作将值与几种情况进行比较,并仅执行匹配的情况。 Switch 表达式支持的类型是字符串和整数。 Switch 可包含默认操作,如果没有匹配则运行该操作。
例如,假设你正在处理电子邮件,并希望根据消息重要性做出不同的答复。 Outlook 电子邮件中的重要性是 0-2 间的整数。 以下伪代码显示了如何为电子邮件重要性构建 switch 操作。
switch (Importance)
case 0: ... // action(s) for low importance
case 1: ... // action(s) for medium importance
case 2: ... // action(s) for high importance
default: ...
Foreach 循环
Foreach 循环控制操作处理数组。 该循环对每个数组项执行相同的操作。 在默认情况下,每个数组元素的操作并行运行,但可在循环配置中控制此行为。
例如,“发布新推文时”触发器返回的部分推文数据是推文所含媒体的 URL 的数组。 假设你要将每个 URL 插入数据库中自己的行。 可使用 foreach 操作(如以下伪代码)来执行处理:
foreach url in MediaUrls
insert-row
Until 循环
Until 循环控制操作多次运行一组操作。 可设置三个不同的停止条件,循环运行直到其中一个为 true:
- Condition:每次迭代后计算的表达式
- Count:最大迭代次数。 默认值为 60。
- Timeout:允许使用 ISO 8601 格式指定的最大时钟时间。 默认值为一小时。
此循环可用于处理数据,但当需要重试网络操作直到成功或超时时,它也是一个不错的选择。例如,假设工作流必须运行发出 HTTP 请求的操作。 可使用类似于以下伪代码中所示示例的 until 循环(时间值 PT5M
等于五分钟):
repeat
HTTP Get
until (StatusCode is-equal-to 200 OR Count is-greater-than 3 OR Timeout is-greater-than PT5M)
使用设计器添加控制操作
工作流设计器提供了一种可视化方式来添加和配置控制操作。 所有的控制操作都打包在 Control 连接器内,所以第一步就是找到该连接器。 找到该连接器后,你将从先前讨论的控制操作以及一些有用的控制操作中进行选择,但后者与我们管理控制流的目标没有直接关系。 下面的屏幕截图显示了在设计器中显示的可用控制操作:
设计器还提供了一种可视化方式来生成复杂的表达式,包括组。 下面的屏幕截图显示了设计器中显示的 Condition 操作:
在我们的社交媒体监视应用中,我们将使用 Condition 控制操作添加 if 语句来测试情绪分数。