次の方法で共有

添加循环以重复 Azure Logic 应用的工作流中的动作

适用范围:Azure 逻辑应用(消耗型 + 标准型)

若要在逻辑应用工作流中重复作,可以根据方案的需求将 For each 循环或 Until 循环添加到工作流。

注意

正在查找有关循环的 Power Automate 文档? 请参阅 Use 循环

根据用例,可以从以下类型的循环作中进行选择:

  • 若要对数组或集合中的项重复一个或多个操作,请将 For each 操作 添加到工作流中。

    或者,如果你有接收数组的触发器并且希望针对每个数组项运行迭代,则可以使用 SplitOn 触发器属性“分离”该数组。

  • 若要重复一个或多个操作直到条件得到满足或特定状态更改,请将 Until 操作 添加到工作流中。

    工作流首先运行循环内的所有操作,然后检查条件或状态。 如果满足该条件,则循环将停止。 否则,循环将继续进行。 有关工作流可以有的 Until 循环数的默认值和最大限制,请参阅并发、循环和拆分限制

先决条件

以下步骤使用 Azure 门户,但利用适当的 Azure 逻辑应用扩展,也可使用以下工具来生成逻辑应用工作流:

某些步骤因使用的是消耗工作流还是标准工作流而略有不同。

对于每个

For 每个作仅适用于数组。 此循环对数组中的每个项重复一个或多个作。 查看 每个作的 以下注意事项:

  • “For each”操作可处理的数组项数是有限的。 有关此限制,请参阅并发、循环和拆分限制

  • 默认情况下,“For each”操作中的周期或迭代同时并行运行。

    此行为不同于 Power Automate 的“应用到每项”循环,该循环一次运行一个迭代,或按顺序运行。 如果你的用例需要顺序处理,则可以 设置 For each 迭代一次运行一次。 例如,如果想使用延迟操作暂停“For each”操作中的下一次迭代,则需要将每个迭代设置为按顺序运行。

    此默认行为的例外是,嵌套“For each”操作的迭代始终按顺序运行,而不是并行运行。 若要对嵌套 For 中的每个 作中的数组项并发运行作, 请创建和调用子工作流

  • 若要在每次迭代期间从变量操作获得可预测的结果,请按顺序运行这些迭代。 例如,当并发运行的迭代结束时,“递增变量”、“递减变量”和“附加到变量”操作将返回可预测的结果。 但是,在并发运行循环的每次迭代期间,这些操作可能会返回不可预测的结果。

  • For each 循环中的操作使用 来引用和处理数组中的每个项。 如果指定了不在数组中的数据,则工作流将失败。

以下示例工作流会发送网站 RSS 源的每日摘要。 该工作流使用“For each”操作,它会为每个新项发送电子邮件。

  1. Azure 门户中,按指定顺序创建具有以下步骤的逻辑应用工作流:

    • 名为“发布源项时”的 RSS 触发器

      按照以下常规步骤将触发器添加到 消耗标准 逻辑应用工作流。

    • 名为“发送电子邮件”的 Outlook.com 或 Office 365 Outlook 操作

      按照以下常规步骤将作添加到 消耗标准 逻辑应用工作流。

  2. 按照相同的常规步骤在 RSS 触发器和工作流中发送电子邮件作之间添加 For each作。

  3. 现在,构建循环:

    1. 在“ 对于每个 项”中,在 “选择上一步的输出 ”框中选择,然后选择闪电图标。

    2. 从打开的动态内容列表中,在 “发布源项时”下,选择 源链接,这是 RSS 触发器的数组输出。

      注意

      如果未显示“源链接”输出,请在触发器部分标签旁边选择“查看更多”。 在动态内容列表中,只能选择前面步骤中的输出。

      屏幕截图显示了 Azure 门户和工作流设计器,其中包含一个名为“For each”的作和打开的动态内容列表。

      完成后,所选数组输出将如以下示例所示:

      屏幕截图显示了工作流设计器和名为“For each”的作,其中选择了数组输出。

    3. 若要对每个数组项运行现有操作,请将“发送电子邮件”操作拖到 For each 循环中。

      现在,工作流如以下示例所示:

      屏幕截图显示了工作流设计器、名为“For each”的作和名为“发送电子邮件”的作,现在位于“For each”作内。

  4. 完成后,保存工作流。

  5. 若要手动测试工作流,请在设计器工具栏上选择“ 运行>运行”。

“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 每个 作中的迭代同时并行运行。 但是,如果你有嵌套循环或具有预期可预测结果的循环中的变量,则必须一次按顺序运行这些循环。

  1. 在设计器上,选择“For each作”以打开信息窗格,然后选择“设置”。

  2. 并发控制下,将设置从 “关闭 ”更改为 “开”。

  3. 并行度 滑块移动到 1

    屏幕截图显示了“对于每个作”、“设置”选项卡和打开的“并发控制设置”,并行度滑块设置为 1。

“For each”操作定义 (JSON):按顺序运行

如果要在代码视图中使用 For_each 工作流的 JSON 定义中的作,请添加 operationOptions 参数并将参数值设置为 Sequential

"actions": {
   "For_each": {
      "actions": {
         "Send_an_email_(V2)": { }
      },
      "foreach": "@triggerBody()?['links']",
      "runAfter": {},
      "type": "Foreach",
      "operationOptions": "Sequential"
   }
}

截止

“Until”操作运行并重复一个或多个操作,直到满足所需的指定条件。 如果满足该条件,则循环将停止。 否则,循环将继续进行。 有关 Until 作或迭代数的默认和最大限制,请参阅 并发性、循环和取消批处理限制

以下列表包含可以使用“Until”操作的一些常见场景:

  • 调用某个终结点,直至获得想要的响应。

  • 在数据库中创建记录。 等待该记录中的特定字段获得批准。 继续处理。

默认情况下, Until 作以下列方式成功或失败:

  • 如果循环中的所有作都成功,并且根据运行后的行为达到循环限制,则 Until 循环会成功。

  • 如果 Until 循环的最后一次迭代中的所有作都成功,则整个 Until 循环将标记为 “成功”。

  • 如果在 Until 循环的最后一次迭代中有任何作失败,则整个 Until 循环将标记为 “失败”。

  • 如果任何作在上次迭代之外的迭代中失败,则下一次迭代将继续运行,并且整个 Until 作未标记为 “失败”。

    若要使作失败,请通过添加名为 operationOptions的参数并将值设置为 FailWhenLimitsReached 来更改循环的 JSON 定义中的默认行为,例如:

    "Until": {
       "actions": {
         "Execute_stored_procedure": {
           <...>
           }
         },
         "expression": "@equals(variables('myUntilStop'), true)",
         "limit": {
           "count": 5,
           "timeout": "PT1H"
         },
         "operationOptions": "FailWhenLimitsReached",
         "runAfter": {
         "Initialize_variable_8": [
           "Succeeded"
         ]
       },
    "type": "Until"
    }
    

在以下示例工作流中,从每天上午 8:00 开始,“Until”操作递增变量,直到变量的值等于 10。 然后,该工作流会发送一封电子邮件来确认当前值。 此示例使用 Office 365 Outlook,但你可以使用 Azure 逻辑应用支持的任何电子邮件提供程序。 如果使用其他电子邮件帐户,常规步骤保持不变,但看起来略有不同。

  1. Azure 门户中,使用空白工作流创建逻辑应用资源。 请参阅前面的过程。

  2. 在设计器中,按照常规步骤将名为 Recurrence的计划内置触发器添加到消耗标准工作流。

  3. “定期 ”触发器中,指定触发触发器的间隔、频率和时间。

    参数
    间隔 1
    频率
    在这些小时 8
    这些分钟 00

    在这些小时这些分钟 后,你设置为 “频率 ”设置为 “天”。

    完成后,“定期”触发器如以下示例所示:

    屏幕截图显示了设置了定期触发器参数的 Azure 门户和工作流设计器。

  4. 在触发器下,按照以下常规步骤将名为 Initialize 变量变量内置作添加到消耗标准逻辑应用工作流。

  5. Initialize 变量 作中,提供以下值:

    参数 描述
    名称 限制 变量的名称
    类型 整数 变量的数据类型
    0 变量的起始值

    屏幕截图显示了 Azure 门户、工作流设计器和名为 Initialize 变量的内置作,其中包含参数。

  6. “初始化变量”作下,按照以下常规步骤将名为 UntilControl 内置作添加到消耗标准逻辑应用工作流。

  7. 在“Until”操作中,提供以下值以设置循环的停止条件。

    1. “循环直到 ”框中选择,然后选择闪电图标以打开动态内容列表。

    2. 从列表中的“变量”下,选择名为“Limit”的变量。

    3. “计数”下,输入 10 作为比较值。

    屏幕截图显示了名为 Until 的工作流和内置作,其中包含所述的值。

  8. “直到 ”作中,选择“ +>添加作”。

  9. 按照以下常规步骤将名为 Increment 变量变量内置作添加到消耗标准逻辑应用工作流中的 Until作。

  10. 在“递增变量”操作中,提供以下值以将 Limit 变量的值递增 1:

    参数
    限制 选择“Limit”变量。
    1

    屏幕截图显示了一个名为 Until 的工作流和内置作,其限制设置为“限制”变量,“值”设置为 1。

  11. “直到 ”作外部和“直到”作下,按照以下常规步骤添加在 消耗标准 逻辑应用工作流中发送电子邮件的作。

    此示例继续使用名为“发送电子邮件”的 Office 365 Outlook 操作。

  12. 在电子邮件操作中,提供以下值:

    参数 描述
    < > 收件人的电子邮件地址。 若要进行测试,请使用你自己的电子邮件地址。
    主题 “Limit”变量的当前值为:Limit 电子邮件主题。 对于此示例,请确保包括 Limit 变量,以确认当前值满足指定的条件:

    1.在 “主题 ”框中选择,然后选择闪电图标。

    2. 从打开的动态内容列表中,在 “变量 ”部分标题旁边,选择“ 查看更多”。

    3. 选择“Limit”。
    正文 < email-content> 你要发送的电子邮件消息内容。 对于本例,输入你所需的任何文本。

    完成后,电子邮件操作将如以下示例所示:

    屏幕截图显示了名为“发送电子邮件”的工作流和作,其中包含属性值。

  13. 保存工作流。

测试工作流

若要手动测试逻辑应用工作流,请执行以下作:

  • 在设计器工具栏上,从 “运行 ”选项中选择“ 运行”。

在你的工作流开始运行后,你将收到一封包含指定内容的电子邮件:

屏幕截图显示了从示例工作流收到的示例电子邮件。

防止无限循环

Until作根据可选的 CountTimeout 参数停止执行。 请确保相应地设置这些参数值:

参数 描述
计数 在循环退出之前运行的最大迭代次数。

有关工作流可以有的“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"
            },
            "runAfter": {},
            "type": "ApiConnection"
         }
      },
      "expression": "@equals(body('Create_new_resource'), 'Completed')",
      "limit": {
         "count": 10,
         "timeout": "PT2H"
      },
      "runAfter": {}
   }
}