使用 Azure 逻辑应用创建在工作流中重复操作的循环
适用范围:Azure 逻辑应用(消耗型 + 标准型)
Azure 逻辑应用包括可在工作流中使用的以下循环操作:
要对数组中的项重复一个或多个操作,请向工作流添加“For each 操作”。
或者,如果你有接收数组的触发器并且希望针对每个数组项运行迭代,则可以使用 SplitOn 触发器属性“分离”该数组。
若要重复一个或多个操作,直到满足条件或状态更改,请向工作流添加“Until”操作。
工作流首先运行循环内的所有操作,然后检查条件或状态。 如果满足该条件,则循环将停止。 否则,循环将继续进行。 有关工作流可以有的 Until 循环数的默认值和最大限制,请参阅并发、循环和拆分限制。
先决条件
Azure 帐户和订阅。 如果没有订阅,可以注册 Azure 帐户。
有关逻辑应用工作流的基础知识
对于每个
For each 操作仅适用于数组,并对数组中的每个项重复一个或多个操作。 以下列表包含一些有关何时要使用“For each”操作的注意事项:
“For each”操作可处理的数组项数是有限的。 有关此限制,请参阅并发、循环和拆分限制。
默认情况下,“For each”操作中的周期或迭代同时并行运行。
此行为不同于 Power Automate 的“应用到每项”循环,该循环一次运行一个迭代,或按顺序运行。 但是,可以设置顺序 For each 循环迭代。 例如,如果想使用延迟操作暂停“For each”操作中的下一次迭代,则需要将每个迭代设置为按顺序运行。
此默认行为的例外是,嵌套“For each”操作的迭代始终按顺序运行,而不是并行运行。 若要对嵌套循环中的项目并行运行操作,请创建并调用子逻辑应用工作流。
若要在每次迭代期间从变量操作获得可预测的结果,请按顺序运行这些迭代。 例如,当并发运行的迭代结束时,“递增变量”、“递减变量”和“附加到变量”操作将返回可预测的结果。 但是,在并发运行循环的每次迭代期间,这些操作可能会返回不可预测的结果。
For each 循环中的操作使用
item()
函数来引用和处理数组中的每个项。 如果指定了不在数组中的数据,则工作流将失败。
以下示例工作流会发送网站 RSS 源的每日摘要。 该工作流使用“For each”操作,它会为每个新项发送电子邮件。
根据你使用的是消耗工作流还是标准工作流,遵循相应的步骤:
在 Azure 门户中,使用以下步骤按指定顺序创建消耗型逻辑应用工作流示例:
名为“发布源项时”的 RSS 触发器
有关详细信息,请按照这些常规步骤添加触发器。
名为“发送电子邮件”的 Outlook.com 或 Office 365 Outlook 操作
有关详细信息,请按照这些常规步骤添加操作。
按照相同的常规步骤在工作流中的 RSS 触发器和“发送电子邮件”操作之间添加“For each”操作。
现在,构建循环:
选择“从先前的步骤中选择一个输出”框以打开动态内容列表。
在“添加动态内容”列表中,从“发布源项时”部分选择“源链接”,这是 RSS 触发器的数组输出。
注意
如果未显示“源链接”输出,请在触发器部分标签旁边选择“查看更多”。 在动态内容列表中,只能选择前面步骤中的输出。
完成后,所选数组输出将如以下示例所示:
若要对每个数组项运行现有操作,请将“发送电子邮件”操作拖到 For each 循环中。
现在,工作流如以下示例所示:
完成后,保存工作流。
若要手动测试工作流,请在设计器工具栏中选择“运行触发器”>“运行”。
“For each”操作定义 (JSON)
如果使用的是代码视图,则可以在工作流的 JSON 定义中定义 For_each
操作,例如:
"actions": {
"For_each": {
"actions": {
"Send_an_email_(V2)": {
"type": "ApiConnection",
"inputs": {
"body": {
"Body": "@{item()}",
"Subject": "New CNN post @{triggerBody()?['publishDate']}",
"To": "me@contoso.com"
},
"host": {
"connection": {
"name": "@parameters('$connections')['office365']['connectionId']"
}
},
"method": "post",
"path": "/v2/Mail"
},
"runAfter": {}
}
},
"foreach": "@triggerBody()?['links']",
"runAfter": {},
"type": "Foreach"
}
},
For each:按顺序运行
默认情况下,For each 循环中的迭代将同时运行,或并行运行。 但是,如果在你期望结果可预测的循环中有嵌套循环或变量,则必须一次运行一个循环或按顺序运行这些循环。
“For each”操作定义 (JSON):按顺序运行
如果使用的是工作流的 JSON 定义中具有 For_each
操作的代码视图,则可以通过添加 operationOptions
参数来使用 Sequential
选项,例如:
"actions": {
"For_each": {
"actions": {
"Send_an_email_(V2)": { }
},
"foreach": "@triggerBody()?['links']",
"runAfter": {},
"type": "Foreach",
"operationOptions": "Sequential"
}
}
截止
“Until”操作运行并重复一个或多个操作,直到满足所需的指定条件。 如果满足该条件,则循环将停止。 否则,循环将继续进行。 有关工作流可以有的“Until”操作数或迭代数的默认值和最大限制,请参阅并发、循环和拆分限制。
以下列表包含可以使用“Until”操作的一些常见场景:
调用某个终结点,直至获得想要的响应。
在数据库中创建记录。 等待该记录中的特定字段获得批准。 继续处理。
在以下示例工作流中,从每天上午 8:00 开始,“Until”操作递增变量,直到变量的值等于 10。 然后,该工作流会发送一封电子邮件来确认当前值。
注意
此示例使用 Office 365 Outlook,但你也可以使用 Azure 逻辑应用支持的任何电子邮件提供商。 如果使用其他电子邮件帐户,则常规步骤保持不变,但 UI 外观可能稍有不同。
在 Azure 门户中,使用空白工作流创建消耗型逻辑应用资源。
在定期触发器中,指定要触发器触发的间隔、频率和当日时间点。
属性 值 间隔 1 频率 天 在这些小时 8 若要添加“在以下时间点”参数,请打开“添加新参数”列表,然后选择“在以下时间点”,该选项仅在将“频率”设置为“天”后才会显示。
完成后,“定期”触发器如以下示例所示:
在“初始化变量”操作中,提供以下值:
属性 价值 描述 名称 限制 变量的名称 类型 Integer 变量的数据类型 值 0 变量的起始值 在“初始化变量”操作下,按照以下常规步骤将名为 Until 的“控制”内置操作添加到工作流。
在“Until”操作中,提供以下值以设置循环的停止条件。
选择最左侧的“选择值”框,该框会自动打开动态内容列表。
从列表中的“变量”下,选择名为“Limit”的变量。
从中间运算符列表中,选择“等于”运算符。
在最右侧的“选择值”框中,输入 10 作为比较值。
在“Until”选项中,选择“添加操作”。
在“选择操作”搜索框中,按照这些常规步骤将名为“递增变量”的变量内置操作添加到“Until”操作。
在“递增变量”操作中,提供以下值以将 Limit 变量的值递增 1:
属性 值 Name 选择“Limit”变量。 值 1 在“Until”操作外部和下方,按照这些常规步骤添加发送电子邮件的操作。
此示例继续使用名为“发送电子邮件”的 Office 365 Outlook 操作。
在电子邮件操作中,提供以下值:
属性 价值 说明 To email-address@domain<> 收件人的电子邮件地址。 若要进行测试,请使用你自己的电子邮件地址。 主题 “Limit”变量的当前值为:Limit 电子邮件主题。 对于此示例,请确保包括 Limit 变量,以确认当前值满足指定的条件:
1. 选择“主题”框以显示动态内容列表。
2. 在动态内容列表中的“变量”部分标题旁边,选择“查看更多”。
3. 选择“Limit”。正文 <email-content> 你要发送的电子邮件消息内容。 对于本例,输入你所需的任何文本。 完成后,电子邮件操作将如以下示例所示:
保存工作流。
测试工作流
若要手动测试逻辑应用工作流,请根据你的逻辑应用是消耗型还是标准型逻辑应用执行相关步骤。
在你的工作流开始运行后,你将收到一封包含指定内容的电子邮件:
防止无限循环
“Until”操作根据以下属性停止执行,可以通过在操作中选择“更改限制”来查看这些属性。 请确保相应地设置这些属性值:
properties | 描述 |
---|---|
计数 | 在循环退出之前运行的最大迭代次数。 有关工作流可以有的“Until”操作数的默认值和最大限制,请参阅并发、循环和拆分限制。 |
超时 | “Until”操作(包括所有迭代)在循环退出前运行的最长时间。 此值以 ISO 8601 格式指定,每次迭代时都会评估该值。 如果循环中的任何操作花费的时间超过超时限制,当前迭代便不会停止。 但是,由于满足超时限制条件,因此下一个迭代不会启动。 有关“超时”值的默认值和最大限制,请参阅并发、循环和拆分限制。 |
Until 定义 (JSON)
如果使用的是代码视图,则可以在工作流的 JSON 定义中定义 Until
操作,例如:
"actions": {
"Initialize_variable": {
// Definition for initialize variable action
},
"Send_an_email": {
// Definition for send email action
},
"Until": {
"type": "Until",
"actions": {
"Increment_variable": {
"type": "IncrementVariable",
"inputs": {
"name": "Limit",
"value": 1
},
"runAfter": {}
}
},
"expression": "@equals(variables('Limit'), 10)",
// To prevent endless loops, an "Until" loop
// includes these default limits that stop the loop.
"limit": {
"count": 60,
"timeout": "PT1H"
},
"runAfter": {
"Initialize_variable": [
"Succeeded"
]
}
}
}
此示例“Until”循环调用可创建资源的 HTTP 终结点。 当 HTTP 响应主体返回 Completed
状态时,循环停止。 为防止无限循环,该循环在发生下列任一条件时也会停止:
循环运行了 10 次(由
count
属性指定)。 默认值为 60 次。循环已运行两小时(由
timeout
属性以 ISO 8601 格式指定)。 默认值为一小时。
"actions": {
"myUntilLoopName": {
"type": "Until",
"actions": {
"Create_new_resource": {
"type": "Http",
"inputs": {
"body": {
"resourceId": "@triggerBody()"
},
"url": "https://domain.com/provisionResource/create-resource",
"body": {
"resourceId": "@triggerBody()"
}
},
"runAfter": {},
"type": "ApiConnection"
}
},
"expression": "@equals(triggerBody(), 'Completed')",
"limit": {
"count": 10,
"timeout": "PT2H"
},
"runAfter": {}
}
}