使用控制操作改变控制流

已完成

控制操作可帮助逻辑应用工作流做出决策。 社交媒体监视应用将使用控制操作来测试推文的情绪分数,并根据推文是正面情绪还是负面情绪来分支工作流路径。 在本单元中,我们将介绍协助管理工作流执行路径的四个控制操作。 我们还将讨论如何使用工作流设计器添加和配置控制操作。

条件操作

Condition 控制操作是一个 if 语句,可根据正在处理的数据将工作流分为两个路径。 此操作包含一个布尔表达式和两项操作。 在运行时,执行引擎会根据表达式是 true 还是 false 来计算表达式并选择操作。

例如,你可能希望根据金额将费用报表发送给其他管理人员。 如果你正在处理一封电子邮件,则可能需要测试它是否被标记为高优先级。 在我们的社交媒体监视应用中,我们将使用 Condition 语句根据推文的情绪分数进行分支。 下图显示工作流如何使用 Condition 控制操作。

Diagram shows a conceptual view for the entire social media monitoring app. The *condition* control action appears highlighted.

类型和运算符

可在 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 连接器内,所以第一步就是找到该连接器。 找到该连接器后,你将从先前讨论的控制操作以及一些有用的控制操作中进行选择,但后者与我们管理控制流的目标没有直接关系。 下面的屏幕截图显示了在设计器中显示的可用控制操作:

Screenshot shows the actions in the **Control** connector in the workflow designer. The list includes the following control flow actions: **Condition**, **For each**, **Switch**, and **Until**.

设计器还提供了一种可视化方式来生成复杂的表达式,包括组。 下面的屏幕截图显示了设计器中显示的 Condition 操作:

Screenshot shows a configured **Condition** action in the workflow designer. The image contains a **Sentiment** action followed by a **Condition** action. The **Condition** action has a simple expression that tests whether the sentiment score is greater than 0.7.

在我们的社交媒体监视应用中,我们将使用 Condition 控制操作添加 if 语句来测试情绪分数。