你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

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

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

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

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

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

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

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

先决条件

对于每个

For 每个操作仅适用于数组,对数组中的每个项重复一个或多个操作。 以下列表包含一些有关何时要使用“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 触发器的数组输出。

      注意

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

      Screenshot shows Azure portal, Consumption workflow designer, action named For each, and opened dynamic content list.

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

      Screenshot shows Consumption workflow, action named For each, and selected array output.

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

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

      Screenshot shows Consumption workflow, action named For each, and action named Send an email, now inside For each loop.

  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”,然后选择“完成”。

    Screenshot shows Consumption workflow, action named For each, concurrency control setting turned on, and degree of parallelism slider set to 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

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

    Screenshot shows Azure portal, Consumption workflow designer, and Recurrence trigger parameters with selected option for At these hours.

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

    Screenshot shows Azure portal, Consumption workflow, and Recurrence trigger parameters set up.

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

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

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

    Screenshot shows Azure portal, Consumption workflow, and parameters for built-in action named Initialize variable.

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

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

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

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

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

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

    Screenshot shows Consumption workflow and built-in action named Until with finished stop condition.

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

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

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

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

    Screenshot shows Consumption workflow and built-in action named Until with Name set to the Limit variable and Value set to 1.

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

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

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

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

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

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

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

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

    Screenshot shows Consumption workflow and action named Send an email with property values.

  13. 保存工作流。

测试工作流

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

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

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

Screenshot shows sample email received from example workflow.

防止无限循环

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

后续步骤