在 Azure Logic Apps 工作流程中執行迴圈以重複執行動作

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

若要對陣列或集合中的每個項目執行相同動作,或重複動作直到邏輯應用程式工作流程完成某件事,請在工作流程中分別新增名為 For each 或 Until 的 Control 動作:

Action 任務
對於每個 對陣列或集合項目重複一個或多個動作。 僅適用於陣列和集合。

提示:如果您有一個處理陣列的觸發程序,且想為每個陣列項目執行工作流程執行個體,請設定觸發程序的 Split on 屬性 來進行陣列的解除批次處理。

相關資訊請參見 並行、迴圈與去批次限制。
Until 重複一個或多個動作,直到條件達成或特定狀態改變為止。

你的工作流程會先執行迴圈中的所有動作,然後檢查條件或狀態。 如果符合條件,則迴圈會停止。 否則,迴圈會重複。

相關資訊請參見 並行、迴圈與去批次限制。

本指南說明如何將迴圈加入工作流程、依序執行迭代,並避免無止境的迴圈。 跳到你想做的任務:

附註

關於 Power Automate 的文件,請參見使用迴圈。

先決條件

  • Azure 帳戶和訂用帳戶。 申請一個免費的 Azure 帳號。

  • 您想要在其中執行迴圈的 Logic Apps 工作流程,包括會啟動該工作流程的觸發程序。

    在你加入迴圈動作之前,你的工作流程必須 先從觸發器作為 第一步開始。

本指南使用 Azure 入口網站,但你也可以使用 Visual Studio Code 及相應的 Azure Logic Apps 擴充功能來建立邏輯應用程式的工作流程:

每個迴路的考量

For each 動作會重複一個或多個對每個陣列或集合項目的動作。

  • For 每個動作僅適用於陣列與集合。

  • 對於每個動作,處理有限數量的陣列項目。

  • 預設情況下, 每個 動作的迭代會平行執行。 需要了解的關鍵行為:

    行為 這是什麼意思?
    預設為平行 不像 Power Automate 的 「套用至每個項目」 迴圈,各次迭代不會一次只執行一個。

    如果你的情境需要順序處理,請參考 「連續執行每個迭代」。 例如,要在「 For each action」中使用 延遲動作暫停下一次迭代,並設定每次迭代為依序執行。
    巢狀迴圈 巢狀的 For each 動作一律會循序執行。 若要平行執行,請 建立並呼叫子工作流程。
    Variables 增量變數、 遞減變數和 附加變數 在平行迴圈中可能會回傳不可預測的結果。 為了確保迴圈中的變數在每次迭代中對變數的操作產生可預測的結果,請依 序執行迴圈。
  • For each 迴圈中的動作會使用 item() 函式來參考和處理陣列中的每個項目。 如果您指定的資料不是在陣列中,則工作流程將會失敗。

在你的工作流程中加入「For each 迴圈」

下列範例工作流程會傳送網站 RSS 摘要的每日摘要。 工作流程會使用對為每個新項目傳送電子郵件的 For each 動作。

  1. 在 Azure 入口網站中,依指定順序執行下列步驟以建立邏輯應用工作流程:

    • 名為摘要項目發佈時的 RSS 觸發程序

      遵循下列一般步驟,將觸發程序新增至取用或標準邏輯應用工作流程。

    • 名為傳送電子郵件的 Outlook.com 或 Office 365 Outlook 動作

      遵循下列一般步驟,將動作新增至取用或標準邏輯應用工作流程。

  2. 在設計工具中,根據您的工作流程類型,依照一般步驟,在觸發程序與 傳送電子郵件 動作之間新增名為 針對每個 的動作:

  3. 現在建置迴圈:

    1. 在 For each 動作中,選取 從先前步驟選取輸出 方塊內部以檢視輸入選項,然後選取閃電圖示。

    2. 從開啟的動態內容清單中,在 [當摘要項目發佈時] 底下,選取 [摘要連結],這是來自 RSS 觸發程序的陣列輸出。

      附註

      如果 [摘要連結] 輸出未出現,請在觸發程序區段標籤旁,選取 [顯示較多]。 從動態內容清單中,您可以選取僅限先前步驟中的輸出。

      顯示 Azure 入口網站和工作流程設計工具的螢幕擷取畫面,其中有一個名為「For each」的動作,並開啟了動態內容清單。

      以下範例顯示所選陣列的輸出:

      顯示工作流程設計器和名為「For each」且已選取陣列輸出的動作的螢幕擷取畫面。

    3. 若要在每個陣列項目上執行現有的動作,請將 [傳送電子郵件] 動作拖曳至 For each 迴圈。

      你的工作流程如下範例:

      顯示工作流程設計工具的螢幕擷取畫面,其中有名為 For each 的動作,以及名為 Send an email 的動作;現在,Send an email 動作位於 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 動作中的反覆項目會同時平行執行。 不過,如果您有巢狀迴圈,或者在迴圈內有變數,並且您期望在其中獲得可預測的結果,則必須按順序逐一執行那些迴圈。

  1. 在設計工具上,選取 For each 動作以開啟資訊窗格,然後選取 [設定]。

  2. 在 [並行控制] 底下,將設定從 [關閉] 變更為 [開啟]。

  3. 將平行度滑桿移至 1。

    截圖顯示「每個動作」、「設定」標籤和並行控制設定已開啟,平行度滑桿設為 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 動作的一些常見案例:

  • 呼叫端點,直到您獲得想要的回應。

  • 在資料庫中建立記錄。 等到該記錄中的特定欄位獲得核准。 繼續處理。

依預設,Until 動作會以下列方式成功或失敗:

  • 「Until」迴圈只有在迴圈中的所有動作都成功執行,且根據執行後行為達到迴圈限制時,才會視為成功。

  • 如果 Until 循環最後一次反覆運算中的所有動作都成功,整個 Until 迴圈會標示為 Succeeded。

  • 如果 Until 循環的最後一個反覆專案中有任何動作失敗,整個 Until 迴圈會標示為 失敗。

  • 如果任何動作在最後一個反覆項目之外的反覆項目中失敗,則下一個反覆項目會繼續執行,而且整個 Until 動作不會被標記為失敗。

    若要改為讓動作失敗,請在迴圈的 JSON 定義中變更預設行為 (方法是新增名為 operationOptions 的參數,並將值設為 FailWhenLimitsReached),例如:

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

在工作流程中新增一個「直到」迴圈

以下範例工作流程每天從上午8點開始。 工作流程會使用 Until 動作來遞增變數直到值等於 10。 接著,工作流程會傳送用來確認目前值的電子郵件。 此範例使用 Office 365 Outlook,但您可以使用 Azure Logic Apps 支援的任何電子郵件提供者。 如果您使用其他電子郵件帳戶,則一般步驟會保持不變,但看起來略有不同。

  1. 在 Azure 入口網站中,建立一個包含空白工作流程的邏輯應用資源。

  2. 在設計工具中,根據您的工作流程類型,依照下列一般步驟新增名為 Recurrence 的 排程 內建觸發程序:

  3. 在 遞迴 觸發器中,提供以下資訊:

    參數 值
    間隔 1
    頻率 Day
    在這幾小時內 8
    在這幾分鐘內 00

    將頻率設定為天後,會顯示在這些小時和在這些分鐘。

    以下範例展示了重 現 觸發器的出現方式:

    顯示 Azure 入口網站和工作流程設計工具且已設定 Recurrence 觸發程序參數的螢幕擷取畫面。

  4. 在設計工具中,根據您的工作流程類型,依照下列一般步驟新增名為 初始化變數 的 變數 內建動作:

  5. 在 初始化變數 動作中,提供以下資訊:

    參數 值 描述
    名稱 限制 你的變數名稱。
    型別 整數 你的變數資料型別。
    ReplTest1 0 你的變數起始值。

    截圖顯示 Azure 入口網站、工作流程設計器,以及內建的 Initialize 變數動作,還有參數。

  6. 在初始化變數動作中,依照你的工作流程類型,依照一般步驟加入名為「直到」的控制內建動作:

  7. 在 Until 動作中,設定迴圈的停止條件:

    1. 在 「循環至」 方塊內按一下,然後按一下閃電圖示,以開啟動態內容清單。

    2. 從清單的 [變數] 底下,選取名為 Limit 的變數。

    3. 在 [計數] 底下,輸入 10 作為比較值。

    截圖顯示工作流程和一個名為 Until 的內建動作,並附上描述的數值。

  8. 在 Until 動作中,選取 [+>新增動作]。

  9. 根據您的工作流程類型,依照一般步驟,將名為 遞增變數 的 Variables 內建動作新增至 Until 動作:

  10. 在 [遞增變數] 動作中,提供下列值,以將 Limit 變數的值遞增 1:

    參數 值
    限制 選取 Limit 變數。
    ReplTest1 1

    截圖顯示工作流程和內建動作「直到」,將限制設為限制變數,值設為 1。

  11. 在「 直到 」動作之外,根據你的工作流程類型,依照一般步驟,新增一個發送電子郵件的動作:

    此範例會繼續進行名為傳送電子郵件的 Office 365 Outlook 動作。

  12. 在電子郵件動作中,提供下列值:

    參數 值 描述
    若要 < 電子郵件地址@domain> 收件者的電子郵件地址。 若要進行測試,請使用自己的電子郵件地址。
    主旨 "Limit" 變數的目前值為:Limit 電子郵件主旨。 針對此範例,請確定您包含 Limit 變數,以確認目前的值符合您的指定條件:

    1. 在 [主題] 方塊內選取,然後選取閃電圖。

    2. 從開啟的動態內容清單中,在 [變數] 區段標題旁,選取 [查看更多]。

    3. 選取 [限制]。
    本文 < 電子郵件內容> 您想要傳送的電子郵件訊息內容。 針對此範例,輸入任何您要的文字。

    以下範例展示了您的電子郵件操作如何呈現:

    截圖顯示一個名為「發送帶有屬性值的電子郵件」的工作流程和動作。

  13. 儲存您的工作流程。

測試您的工作流程

若要手動測試您的邏輯應用程式工作流程:

  • 在設計工具列上,從 [執行] 選項中選取 [執行]。

當您的工作流程開始執行之後,您會收到電子郵件及您指定的內容:

截圖顯示範例工作流程收到的電子郵件範例。

避免無止盡的迴圈

Until 動作會根據選用的 Count 和 Timeout 參數來停止執行。 請確定您已據以設定這些參數值:

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

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

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

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

回顧 Until 循環迭代的運行歷史

當你查看包含 Until 迴圈的工作流程的執行歷史時,迴圈內動作的詳細狀態和結果只有在整個迴圈完成後才會顯示。 當 Until 迴圈仍在執行迭代時,迴圈動作會顯示 Running 狀態,但你無法展開或遍歷每個迭代結果,直到迴圈結束。

當符合以下條件之一時,迴路即結束:

  • 指定的表達式被評估為 真。
  • 迴圈達到 計數 上限。
  • 循環達到 逾時 限制。

迴圈完成後,您可以在執行歷程記錄中選取直到動作,以檢視每次反覆項目和該反覆項目內子動作的狀態。

附註

如果你的 Until 循環持續較長時間,必須等迴圈完全完成後,才能查看各個迭代的運行歷史結果。 為了監控長時間進行中的迴圈,可以考慮在迴圈內加入獨立發出狀態的日誌或通知動作,例如將訊息傳送到佇列或更新平行分支可讀取的變數。

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 格式) 執行了兩個小時。 預設值是一小時。

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

下一步