使用 Azure 逻辑应用创建在工作流中重复操作的循环

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

Azure 逻辑应用包括可在工作流中使用的以下循环操作:

  • 要对数组中的项重复一个或多个操作,请向工作流添加“For each 操作

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

  • 若要重复一个或多个操作,直到满足条件或状态更改,请向工作流添加“Until”操作

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

先决条件

对于每个

For each 操作仅适用于数组,并对数组中的每个项重复一个或多个操作。 以下列表包含一些有关何时要使用“For each”操作的注意事项:

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

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

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

    此默认行为的例外是,嵌套“For each”操作的迭代始终按顺序运行,而不是并行运行。 若要对嵌套循环中的项目并行运行操作,请创建并调用子逻辑应用工作流

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

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

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

根据你使用的是消耗工作流还是标准工作流,遵循相应的步骤:

  1. Azure 门户中,使用以下步骤按指定顺序创建消耗型逻辑应用工作流示例:

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

  1. 在“For each”操作的右上角,选择省略号 (...) >“设置”。

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

  3. 将“并行度”滑块移至“1”,然后选择“完成”。

    屏幕截图显示消耗型工作流,“For each”操作、并发控制设置已开启以及并行度滑块设置为 1。

“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 外观可能稍有不同。

  1. Azure 门户中,使用空白工作流创建消耗型逻辑应用资源。

  2. 在设计器中,按照这些常规步骤将名为“日程安排”的“定期”内置触发器添加到工作流

  3. 在定期触发器中,指定要触发器触发的间隔、频率和当日时间点。

    属性
    间隔 1
    频率
    在这些小时 8

    若要添加“在以下时间点”参数,请打开“添加新参数”列表,然后选择“在以下时间点”,该选项仅在将“频率”设置为“天”后才会显示。

    屏幕截图显示 Azure 门户、消耗型工作流设计器和“定期”触发器参数以及选中的“在以下时间点”选项。

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

    屏幕截图显示 Azure 门户、消耗型工作流和设置的“定期”触发器参数。

  4. 在触发器下,按照这些常规步骤将名为“初始化变量”的“变量”内置操作添加到工作流

  5. 在“初始化变量”操作中,提供以下值:

    属性 价值 描述
    名称 限制 变量的名称
    类型 Integer 变量的数据类型
    0 变量的起始值

    屏幕截图显示 Azure 门户、消耗型工作流和名为“初始化变量”的内置操作变量。

  6. 在“初始化变量”操作下,按照以下常规步骤将名为 Until 的“控制”内置操作添加到工作流

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

    1. 选择最左侧的“选择值”框,该框会自动打开动态内容列表。

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

    3. 从中间运算符列表中,选择“等于”运算符。

    4. 在最右侧的“选择值”框中,输入 10 作为比较值。

    屏幕截图显示消耗型工作流和名为 Until 的内置操作,以及设定的停止条件。

  8. 在“Until”选项中,选择“添加操作”。

  9. 在“选择操作”搜索框中,按照这些常规步骤将名为“递增变量”的变量内置操作添加到“Until”操作

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

    属性
    Name 选择“Limit”变量。
    1

    屏幕截图显示消耗型工作流和名为 Until 的内置操作,其中“名称”设置为“Limit”,“值”设置为“1”。

  11. 在“Until”操作外部和下方,按照这些常规步骤添加发送电子邮件的操作

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

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

    属性 价值 说明
    To email-address@domain<> 收件人的电子邮件地址。 若要进行测试,请使用你自己的电子邮件地址。
    主题 “Limit”变量的当前值为:Limit 电子邮件主题。 对于此示例,请确保包括 Limit 变量,以确认当前值满足指定的条件:

    1. 选择“主题”框以显示动态内容列表。

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

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

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

    屏幕截图显示消耗型工作流和名为“发送电子邮件”的操作及其属性值。

  13. 保存工作流。

测试工作流

若要手动测试逻辑应用工作流,请根据你的逻辑应用是消耗型还是标准型逻辑应用执行相关步骤。

在设计器工具栏上,选择“运行触发器”>“运行”。

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

屏幕截图显示所接受到的示例工作流发出的示例电子邮件。

防止无限循环

“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": {}
   }
}

后续步骤