Loop lussen uit om acties te herhalen in workflows voor Azure Logic Apps

Van toepassing op: Azure Logic Apps (Verbruik + Standard)

Om dezelfde acties op elk item in een array of collectie uit te voeren, of acties te herhalen totdat iets klaar is in je logic app-workflow, voeg je de Control-actie genaamd For each of Until toe aan je workflow respectievelijk:

Action Task
Voor elke Herhaal één of meer acties op items in een matrix of verzameling. Gilt alleen voor arrays en collecties.

Tip: Als je een trigger hebt die arrays verwerkt en een workflow-instantie voor elk array-item wilt uitvoeren, stel dan de Split on-eigenschap van de trigger in om de array te debatchen.

Voor informatie, zie Concurrency, looping en debatching limieten.
Until Herhaal één of meer acties totdat aan een voorwaarde is voldaan of een specifieke toestand verandert.

Je workflow voert eerst alle acties in de lus uit en controleert daarna de conditie of status. Als aan de voorwaarde wordt voldaan, stopt de lus. Anders wordt de lus herhaald.

Zie voor meer informatie gelijktijdigheid, looping en limieten voor debatching.

Deze gids laat zien hoe je een lus aan je workflow kunt toevoegen, iteraties sequentieel kunt uitvoeren en eindeloze lussen kunt voorkomen. Spring naar de taak die je wilt:

Notitie

Voor Power Automate-documentatie, zie Use loops.

Vereisten

Deze gids gebruikt het Azure-portaal, maar je kunt Visual Studio Code en de bijbehorende Azure Logic Apps-extensie gebruiken om Logic App-workflows te bouwen:

Voor elke lus overwegingen

De Voor elke actie herhaalt één of meer acties op elk array of verzamelitem.

  • De Voor elke actie werkt alleen op arrays en verzamelingen.

  • De Voor elke actie verwerkt een beperkt aantal array-items.

  • Standaard draaien Iteraties voor elke actie parallel. Belangrijke gedragingen om te kennen:

    Gedrag Wat betekent het?
    Parallel standaard ingeschakeld In tegenstelling tot de lus Apply to each van Power Automate, worden iteraties niet één voor één uitgevoerd.

    Als voor je scenario sequentiële verwerking nodig is, zie dan Elke iteratie achter elkaar uitvoeren. Bijvoorbeeld: als je met de Delay-actie de volgende iteratie in een Voor elke-actie wilt onderbreken, stel dan elke iteratie zo in dat deze opeenvolgend wordt uitgevoerd.
    Geneste lussen Een geneste For each-actie wordt altijd sequentieel uitgevoerd. Om parallel te draaien, maak en roep een kindworkflow aan.
    Variables Variabele verhogen, Variabele verlagen, en Aan variabele toevoegen kunnen in parallelle loops onvoorspelbare resultaten opleveren. Om ervoor te zorgen dat variabelen in een lus voorspelbare resultaten produceren uit bewerkingen op die variabelen tijdens elke iteratie, voer je de lus sequentieel uit.
  • Acties in een For each-lus gebruiken de functie item() om naar elk item in de array te verwijzen en het te verwerken. Als u gegevens opgeeft die zich niet in een matrix bevindt, mislukt de werkstroom.

Voeg een for-each-lus toe aan je workflow

Met de volgende voorbeeldwerkstroom wordt een dagelijkse samenvatting verzonden voor een RSS-feed van een website. De werkstroom maakt gebruik van een voor elke actie die een e-mail verzendt voor elk nieuw item.

  1. Maak in Azure Portal een werkstroom voor een logische app met de volgende stappen in de opgegeven volgorde:

    • De RSS-trigger met de naam Wanneer een feeditem wordt gepubliceerd

      Volg deze algemene stappen om een trigger toe te voegen aan een werkstroom van een Consumption- of Standard-logic app.

    • De actie Outlook.com of Office 365 Outlook met de naam Een e-mailbericht verzenden

      Volg deze algemene stappen om een actie toe te voegen aan de workflow van een Consumption- of Standard-logische app.

  2. In de ontwerper, tussen de trigger en de actie 'Send a e-mail', voeg je de actie toe genaamd For each door de algemene stappen te volgen op basis van je workflowtype:

  3. Maak nu de lus:

    1. Selecteer in het vakje Voor elke actie in het vakje Selecteer een uitvoer uit eerdere stappen om de invoeropties te bekijken, en selecteer vervolgens het bliksempictogram.

    2. Selecteer in de lijst met dynamische inhoud die wordt geopend, onder Wanneer een feeditem wordt gepubliceerd, feedkoppelingen. Dit is een matrixuitvoer van de RSS-trigger.

      Notitie

      Als de uitvoer Feed links niet wordt weergegeven, selecteert u naast het label van de triggersectie Meer weergeven. In de lijst met dynamische inhoud kunt u alleen uitvoer uit de vorige stappen selecteren.

      Screenshot die de Azure-portaal- en workflowontwerper toont met een actie genaamd For each en de open dynamische contentlijst.

      Het volgende voorbeeld toont de geselecteerde array-uitvoer:

      Screenshot die de workflow-ontwerper en de actie genaamd For each met geselecteerde array-output toont.

    3. Als u een bestaande actie wilt uitvoeren voor elk item in de matrix, sleept u de actie E-mail verzenden naar de lus Voor elke.

      Je workflow ziet eruit als volgt:

      Screenshot die de workflowontwerper toont, actie genaamd For each, en actie genaamd Send a email, nu binnen de For each-actie.

  4. Sla uw workflow op.

  5. Als u uw workflow handmatig wilt testen, selecteert u op de werkbalk van de ontwerper Uitvoeren>Uitvoeren.

Voor elke actiedefinitie (JSON)

Als u in de codeweergave werkt, kunt u de actie definiëren in de For_each JSON-definitie van uw werkstroom, bijvoorbeeld:

"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"
   }
},

Voor elk: loop loopiteraties achtereenvolgens uit

Standaard worden de iteraties in een Voor elke actie parallel uitgevoerd. Als u echter geneste lussen hebt of variabelen in lussen hebt waarin u voorspelbare resultaten verwacht, moet u deze lussen één voor één sequentie uitvoeren.

  1. Selecteer in de ontwerper de actie Voor elke om het informatievenster te openen en selecteer vervolgens Instellingen.

  2. Wijzig onder Gelijktijdigheidsbeheer de instelling van Uit in Aan.

  3. Verplaats de schuifregelaar voor Mate van parallelisme naar 1.

    Schermopname waarop het tabblad Instellingen van de actie Voor elke wordt weergegeven en waarop de instelling Gelijktijdigheidsbeheer is ingeschakeld, met de schuifregelaar voor de mate van parallelisme ingesteld op 1.

Voor elke actiedefinitie (JSON): Voer sequentieel uit

Als u in de codeweergave werkt met de actie For_each in de JSON-definitie van uw werkstroom, voegt u de parameter operationOptions toe en stelt u de waarde van de parameter in op Sequential:

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

Overwegingen bij de until-lus

De actie Until wordt uitgevoerd en herhaalt een of meer acties totdat aan de vereiste opgegeven voorwaarde is voldaan. Als aan de voorwaarde wordt voldaan, stopt de lus. Anders wordt de lus herhaald. Raadpleeg beperkingen voor gelijktijdigheid, herhaling en het opsplitsen van batches voor meer informatie.

De volgende lijst bevat enkele veelvoorkomende scenario's waarin u een actie Until kunt gebruiken:

  • Roep een eindpunt aan totdat u het gewenste antwoord krijgt.

  • Maak een record in een database. Wacht totdat een specifiek veld in die record wordt goedgekeurd. Doorgaan met verwerken.

De actie Until slaagt of mislukt standaard op de volgende manieren:

  • De Until lus slaagt als alle acties in de lus slagen, en als de luslimiet is bereikt, gebaseerd op het gedrag na uitvoering.

  • Als alle acties in de laatste iteratie van de lus Until zijn geslaagd, wordt de hele Until-lus gemarkeerd als Geslaagd.

  • Als een actie mislukt in de laatste iteratie van de Until-lus, wordt de hele Until-lus gemarkeerd als Mislukt.

  • Als een actie mislukt in een andere iteratie dan de laatste, wordt de volgende iteratie nog steeds uitgevoerd en wordt de volledige actie Until niet gemarkeerd als Mislukt.

    Als u de actie wilt laten mislukken, wijzigt u het standaardgedrag in de JSON-definitie van de lus door de parameter met de naam operationOptionstoe te voegen en de waarde in te stellen op FailWhenLimitsReached, bijvoorbeeld:

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

Voeg een Until-lus toe aan je workflow

De volgende voorbeeldworkflow begint elke dag om 8:00 uur 's ochtends. De workflow gebruikt de Before-actie om een variabele te verhogen totdat de waarde gelijk is aan 10. De werkstroom verzendt vervolgens een e-mailbericht dat de huidige waarde bevestigt. In het voorbeeld wordt Office 365 Outlook gebruikt, maar u kunt elke e-mailprovider gebruiken die door Azure Logic Apps wordt ondersteund. Als u een ander e-mailaccount gebruikt, blijven de algemene stappen hetzelfde, maar zien er iets anders uit.

  1. Maak in Azure Portal een logische app-resource met een lege werkstroom.

  2. Voeg in de ontwerper de ingebouwde Schedule-trigger toe genaamd Recurrence door de algemene stappen te volgen op basis van je workflowtype:

  3. Geef in de Recurrence trigger de volgende informatie:

    Kenmerk Waarde
    Interval 1
    Frequentie dag
    Deze uren 8
    Op deze tijdstippen 00

    Op deze uren en op deze minuten worden weergegeven nadat u Frequentie op Dag hebt ingesteld.

    Het volgende voorbeeld laat zien hoe de Recurrence-trigger eruitziet:

    Schermafbeelding van de Azure-portal en de werkstroomontwerper, waarbij de triggerparameters voor Herhaling zijn geconfigureerd.

  4. Voeg in de ontwerper de ingebouwde actie Variables toe genaamd Initialiseer variabele door de algemene stappen te volgen op basis van je workflowtype:

  5. In de actie Variabele initialiseren , geef je de volgende informatie:

    Kenmerk Waarde Beschrijving
    Naam Limiet De naam van je variabele.
    Typ Geheel getal Het datatype van je variabele.
    Waarde 0 De startwaarde van je variabele.

    Screenshot die het Azure-portaal, workflow-ontwerper en ingebouwde actie genaamd Initialiseer-variabele toont, plus de parameters.

  6. Voeg onder de actie Variabele Initialiseren de ingebouwde actie Control toe genaamd Until door de algemene stappen te volgen op basis van je workflowtype:

  7. In de Tot actie stelt u de stopvoorwaarde voor de lus in:

    1. Selecteer in het Loop Before-vak en selecteer vervolgens het bliksempictogram om de lijst met dynamische inhoud te openen.

    2. Selecteer in de lijst onder Variabelen de variabele Limit.

    3. Voer onder Aantal10 in als de vergelijkingswaarde.

    Screenshot die de workflow toont en een ingebouwde actie genaamd Until met de beschreven waarden.

  8. Selecteer in de actie Until+>Een actie toevoegen.

  9. Voeg de ingebouwde actie Variabelen met de naam Variabele verhogen toe aan de Until-actie door de algemene stappen te volgen, afhankelijk van je type workflow:

  10. Geef in de actie Variabele verhogen de volgende waarden op om de waarde van de variabele Limiet met 1 te verhogen:

    Kenmerk Waarde
    Limiet Selecteer de variabele Limiet.
    Waarde 1

    Screenshot die de workflow toont en een ingebouwde actie genaamd Until met Limit ingesteld op Limitvariabele en Value op 1.

  11. Buiten en onder de Tot actie, voeg een actie toe die een e-mail verstuurt door de algemene stappen te volgen op basis van je workflowtype:

    In dit voorbeeld wordt de actie Office 365 Outlook met de naam Een e-mailbericht verzenden voortgezet.

  12. Geef in de e-mailactie de volgende waarden op:

    Kenmerk Waarde Beschrijving
    te < e-mail address@domain> Het e-mailadres van de geadresseerde. Gebruik uw eigen e-mailadres voor testen.
    Onderwerp De huidige waarde voor de variabele Limiet is:Limiet Het e-mailonderwerp. Zorg er voor dit voorbeeld voor dat u de variabele Limiet opneemt om te bevestigen dat de huidige waarde voldoet aan de opgegeven voorwaarde:

    1. Selecteer in het vak Onderwerp en selecteer vervolgens het bliksempictogram.

    2. Selecteer meer in de lijst met dynamische inhoud die wordt geopend, naast de koptekst van de sectie Variabelen.

    3. Selecteer Limiet.
    Hoofdtekst < e-mailinhoud> De inhoud van het e-mailbericht dat u wilt verzenden. Voer voor dit voorbeeld de gewenste tekst in.

    Het volgende voorbeeld laat zien hoe je e-mailactie eruitziet:

    Screenshot die een workflow en actie toont genaamd Stuur een e-mail met eigendomswaarden.

  13. Sla uw workflow op.

Uw werkstroom testen

Uw werkstroom voor logische apps handmatig testen:

  • Selecteer op de werkbalk van de ontwerper vanuit de optie Uitvoeren de optie Uitvoeren.

Nadat uw werkstroom wordt uitgevoerd, ontvangt u een e-mailbericht met de inhoud die u hebt opgegeven:

Screenshot die een voorbeeldmail toont die is ontvangen van een voorbeeldworkflow.

Eindeloze lussen voorkomen

De actie Until stopt de uitvoering op basis van de optionele parameters Aantal en Time-out . Zorg ervoor dat u deze parameterwaarden dienovereenkomstig instelt:

Kenmerk Beschrijving
Aantal Het maximum aantal iteraties dat wordt uitgevoerd voordat de lus wordt afgesloten.

Zie Gelijktijdigheids-, lus- en debatchinglimieten voor de standaard- en maximumlimieten voor het aantal Until-acties dat een werkstroom kan bevatten.
Time-out De maximale tijdsduur dat de actie Until , inclusief alle iteraties, wordt uitgevoerd voordat de lus wordt afgesloten. Deze waarde wordt opgegeven in ISO 8601-indeling en wordt geëvalueerd voor elke iteratie.

Als een actie in de lus langer duurt dan de time-outlimiet, stopt de huidige iteratie niet. De volgende iteratie wordt echter niet gestart omdat aan de voorwaarde voor de time-outlimiet wordt voldaan.

Zie Limieten voor gelijktijdigheid, lussen en debatching voor de standaard- en maximumlimieten van de Timeout-waarde.

De uitvoeringsgeschiedenis van iteraties van de Until-lus bekijken

Wanneer u de uitvoeringsgeschiedenis bekijkt voor een werkstroom die een Until-lus bevat, zijn de gedetailleerde status en resultaten voor acties binnen de lus alleen beschikbaar nadat de hele lus de uitvoering heeft voltooid. Terwijl de Until-lus nog steeds iteraties uitvoert, toont de lusactie de status Running, maar u kunt de resultaten van de afzonderlijke iteraties pas uitvouwen of doorlopen nadat de lus is voltooid.

De lus wordt afgesloten wanneer aan een van de volgende voorwaarden wordt voldaan:

  • De opgegeven expressie evalueert naar true.
  • De lus bereikt de limiet van Count.
  • De lus bereikt de limiet van Timeout.

Nadat de lus is voltooid, kunt u de actie Until in de uitvoeringsgeschiedenis selecteren om elke iteratie en de status van de onderliggende acties in die iteratie weer te geven.

Notitie

Als de lus Until gedurende een langere periode wordt uitgevoerd, moet u wachten tot de lus volledig is voltooid voordat u de uitvoeringsgeschiedenis voor de resultaten van afzonderlijke iteraties kunt controleren. Als u langlopende, actieve lussen wilt bewaken, kunt u logboekregistratie- of meldingsacties toevoegen binnen de lus die bijvoorbeeld onafhankelijk de status verzenden door een bericht naar een wachtrij te verzenden of een variabele bij te werken die door een parallelle vertakking kan worden gelezen.

Until-actiedefinitie (JSON)

Als u in de codeweergave werkt, kunt u een Until actie definiëren in de JSON-definitie van uw werkstroom, bijvoorbeeld:

"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"
         ]
      }
   }
}

In dit voorbeeld roept de lus Until een HTTP-eindpunt aan dat een resource maakt. De lus stopt wanneer de hoofdtekst van het HTTP-antwoord wordt teruggegeven met de status Completed. Om eindeloze lussen te voorkomen, stopt de lus ook als een van de volgende omstandigheden plaatsvindt:

  • De lus werd 10 keer uitgevoerd, zoals gespecificeerd door het kenmerk count. De standaardwaarde is 60 keer.

  • De lus duurde twee uur, zoals opgegeven in het kenmerk timeout in ISO 8601-indeling. De standaardwaarde is één uur.

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

Volgende stappen