使用 Azure Logic Apps 建立迴圈以在工作流程中重複動作

適用於:Azure Logic Apps (使用量 + 標準)

Azure Logic Apps 包含可在工作流程中使用的下列迴圈動作:

  • 若要對陣列中的項目重複一或多個動作,請將 For each 動作新增至您的工作流程。

    此外,如果您的觸發程序接收到陣列,並想要針對每個陣列項目執行反覆運算,您可以使用 SplitOn 觸發屬性將該陣列解除批次

  • 若要重複一或多個動作,直到條件符合或狀態變更為止,請將 Until 動作新增至您的工作流程。

    工作流程會先執行迴圈內的所有動作,然後檢查條件或狀態。 如果符合條件,則迴圈會停止。 否則,迴圈會重複。 如需工作流程可擁有的 Until 迴圈數目的預設值和上限,請參閱並行、迴圈和解除批次處理限制

必要條件

For each

For each 動作僅適用陣列,並且會在陣列中的每個項目上重複一或多個動作。 下列清單包含當您想要使用 For each 動作時的一些考量:

  • For each 動作可以處理數目有限的陣列項目。 如需了解此限制,請參閱並行、迴圈和解除批次處理限制

  • 依預設,For each 動作中的迴圈或反覆運算會同時平行執行。

    此行為不同於 Power Automate 的套用至每個迴圈,其中反覆項目一次執行一個,或依序執行。 不過,您可以設定 For each 反覆運算的順序。 例如,如果您想要使用 Delay 動作暫停 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 Logic Apps 支援的任何電子郵件提供者。 如果您使用其他電子郵件帳戶,整體步驟將維持不變,但您的 UI 外觀可能會略有不同。

  1. Azure 入口網站中,使用空白工作流程建立使用量邏輯應用程式資源。

  2. 在設計工具中,遵循這些一般步驟,將名為排程定期內建觸發程序新增至您的工作流程

  3. 定期觸發程序中,指定要觸發程序引發的間隔、頻率和小時。

    屬性
    間隔 1
    頻率 Day
    在這幾小時內 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. 在 [初始化變數] 動作中,提供下列值:

    屬性 數值 描述
    名稱 限制 變數的名稱
    類型 整數 變數的資料類型
    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:

    屬性
    名稱 選取 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. 在電子郵件動作中,提供下列值:

    屬性 數值 Description
    目標 <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 動作會根據下列屬性停止執行,您可以在動作中選取 [變更限制] 來檢視。 請確定您已據以設定這些屬性值:

屬性 描述
Count 迴圈結束前可執行的反覆運算數目上限。

如需工作流程可擁有的 Until 動作數目的預設值和上限,請參閱並行、迴圈和解除批次處理限制
逾時 Until 動作,包括所有反覆運算,在迴圈結束之前執行的時間上限。 此值是以 ISO 8601 格式指定,而且會使用 For each 反覆運算進行評估。

如果迴圈中有任何動作所花費的時間超過逾時限制,目前的反覆運算並不會停止。 不過,下一個反覆運算不會開始,因為符合逾時限制條件。

如需逾時值的預設值和上限,請參閱並行、迴圈和解除批次處理限制.

"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 時,迴圈就會停止。 若要避免無止盡迴圈,迴圈也會在達到下列任一條件時停止:

  • 迴圈已依 count 屬性所指定的值執行了 10 次。 預設值為 60 次。

  • 迴圈已依 timeout 屬性所指定的值 (ISO 8601 格式) 執行了兩個小時。 預設為 1 小時。

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

下一步