Lägga till loopar för att upprepa åtgärder i arbetsflöden för Azure Logic Apps

Gäller för: Azure Logic Apps (Förbrukning + Standard)

Om du vill upprepa åtgärder i ett logikapparbetsflöde kan du lägga till loopen För varje loop eller Tills i arbetsflödet baserat på behoven för ditt scenario.

Kommentar

Letar du efter Power Automate-dokumentation om loopar? Se Använd loopar.

Baserat på ditt användningsfall kan du välja mellan följande typer av loopåtgärder:

  • Om du vill upprepa en eller flera åtgärder för objekt i en matris eller samling lägger du till åtgärden För varje i arbetsflödet.

    Om du har en utlösare som kan hantera matriser och vill köra en arbetsflödesinstans för varje matrisobjekt kan du också dela upp matrisen genom att ange utlösarens egenskap 'Dela på'.

  • Om du vill upprepa en eller flera åtgärder tills ett villkor uppfylls eller ett visst tillstånd ändras lägger du till åtgärden Till i arbetsflödet.

    Arbetsflödet kör först alla åtgärder i loopen och kontrollerar sedan villkoret eller tillståndet. Om villkoret uppfylls stoppas loopen. Annars upprepas loopen. För standard- och maxgränser för antalet Until-loopar som ett arbetsflöde kan ha, se Begränsningar för samtidighet, loopning och utfasning.

Förutsättningar

Följande steg använder Azure Portal, men med rätt Azure Logic Apps-tillägg kan du också använda följande verktyg för att skapa arbetsflöden för logikappar:

Vissa steg skiljer sig något beroende på om du har ett förbruknings- eller standardarbetsflöde.

För varje

Åtgärden För varje fungerar bara på matriser. Den här loopen upprepar en eller flera åtgärder för varje objekt i en matris. Granska följande överväganden för åtgärden För varje åtgärd:

  • Åtgärden För varje kan bearbeta ett begränsat antal matrisobjekt. Den här gränsen finns i Begränsningar för samtidighet, loopning och utfasning.

  • Som standard körs cyklerna eller iterationerna i en För varje åtgärd samtidigt parallellt.

    Det här beteendet skiljer sig från Power Automates Tillämpa på varje-slinga där iterationer körs en i taget, eller sekventiellt. Om ditt användningsfall kräver sekventiell bearbetning kan du konfigurera För varje iterationer att köra en i taget. Om du till exempel vill pausa nästa iteration i en För varje åtgärd med hjälp av åtgärden Fördröjning måste du konfigurera varje iteration så att den körs sekventiellt.

    Ett undantag från standardbeteende är att iterationerna för en kapslad For each-åtgärd alltid körs sekventiellt, inte parallellt. Om du vill köra åtgärder samtidigt på matrisobjekt i en kapslad för varje åtgärd skapar och anropar du ett underordnat arbetsflöde.

  • Kör iterationerna sekventiellt för att få förutsägbara resultat från åtgärder på variabler under varje iteration. Till exempel returnerar åtgärderna Increment variable, Decrement variable och Append to variable förutsägbara resultat när en iteration som körs parallellt avslutas. Men under varje iteration i loopen som körs samtidigt kan dessa åtgärder returnera oförutsägbara resultat.

  • Åtgärder i en För varje loop använder item() funktionen för att referera till och bearbeta varje objekt i matrisen. Om du anger data som inte finns i en matris misslyckas arbetsflödet.

I följande exempelarbetsflöde skickas en daglig sammanfattning för en webbplats RSS-feed. Arbetsflödet använder en För varje åtgärd som skickar ett e-postmeddelande för varje nytt objekt.

  1. I Azure-portalen skapar du ett arbetsflöde för logikappen med följande steg i den angivna ordningen:

    • RSS-utlösaren med namnet När ett flödesobjekt publiceras

      Följ de här allmänna stegen om du vill lägga till en utlösare i ett arbetsflöde för en Consumption- eller Standard-logikapp.

    • Åtgärden Outlook.com eller Office 365 Outlook med namnet Skicka ett e-postmeddelande

      Följ dessa allmänna steg för att lägga till en åtgärd i arbetsflödet för en Consumption- eller Standard-logikapp.

  2. Följ samma allmänna steg för att lägga till åtgärden För varje mellan RSS-utlösaren och Skicka en e-poståtgärd i arbetsflödet.

  3. Skapa nu loopen:

    1. I rutan För varje objekt väljer du i rutan Välj utdata från föregående steg och väljer sedan blixtikonen.

    2. I listan med dynamiskt innehåll som öppnas under När ett flödesobjekt publiceras väljer du Feed-länkar, vilket är en matrisutdata från RSS-utlösaren.

      Kommentar

      Om feedlänkarnainte visas bredvid utlösaravsnittsetiketten väljer du Visa mer. I listan med dynamiskt innehåll kan du bara välja utdata från föregående steg.

      Skärmbild som visar Azure-portalen och arbetsflödesdesignern med en åtgärd med namnet För varje och den öppna listan med dynamiskt innehåll.

      När du är klar visas de valda matrisutdata som i följande exempel:

      Skärmbild som visar arbetsflödesdesignern och åtgärden med namnet För var och en med valda matrisutdata.

    3. Om du vill köra en befintlig åtgärd för varje matrisobjekt drar du åtgärden Skicka ett e-postmeddelande till för varje loop.

      Nu ser arbetsflödet ut som i följande exempel:

      Skärmbilden visar arbetsflödesdesignern, åtgärden med namnet För varje och åtgärden med namnet Skicka ett e-postmeddelande, nu inuti åtgärden För varje.

  4. Spara arbetsflödet när du är klar.

  5. Om du vill testa arbetsflödet manuellt går du till verktygsfältet designer och väljer Kör>kör.

För varje åtgärdsdefinition (JSON)

Om du arbetar i kodvyn kan du definiera For_each åtgärden i arbetsflödets JSON-definition, till exempel:

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

För varje: Kör sekventiellt

Som standard körs iterationerna i en För varje åtgärd samtidigt parallellt. Men om du har kapslade loopar eller har variabler inuti loopar där du förväntar dig förutsägbara resultat, måste du köra dessa loopar en i taget sekventiellt.

  1. I designern väljer du åtgärden För varje för att öppna informationsfönstret och väljer sedan Inställningar.

  2. Under Samtidighetskontroll ändrar du inställningen från Av till .

  3. Flytta skjutreglaget grad av parallellitet till 1.

    Skärmbild som visar fliken Inställningar för varje åtgärd och inställningen Samtidighetskontroll aktiverad med skjutreglaget för parallellitet inställt på 1.

För varje åtgärdsdefinition (JSON): Kör sekventiellt

Om du arbetar i kodvyn med For_each åtgärden i arbetsflödets JSON-definition lägger du till parametern operationOptions och anger parametervärdet till Sequential:

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

Tills

Until-åtgärden kör och upprepar en eller flera åtgärder tills det angivna villkoret som krävs är uppfyllt. Om villkoret uppfylls stoppas loopen. Annars upprepas loopen. För standard- och maxgränserna för antalet Until-åtgärder eller iterationer, se Begränsningar för samtidighet, loopar och debatching.

Följande lista innehåller några vanliga scenarier där du kan använda en Until-åtgärd :

  • Anropa en slutpunkt tills du får det svar du vill ha.

  • Skapa en post i en databas. Vänta tills ett visst fält i den posten blir godkänt. Fortsätt bearbetningen.

Som standard lyckas eller misslyckas Until-åtgärden på följande sätt:

  • Until-loopen lyckas om alla åtgärder i loopen lyckas och om loopgränsen nås, baserat på beteendet efter körning.

  • Om alla åtgärder i den senaste iterationen av Until-loopen lyckas markeras hela Until-loopen som Lyckades.

  • Om någon åtgärd misslyckas i den sista iterationen av Until-loopenmarkeras hela Until-loopen som Misslyckad.

  • Om någon åtgärd misslyckas i en annan iteration än den senaste iterationen fortsätter nästa iteration att köras och hela till-åtgärden markeras inte som Misslyckad.

    Om du vill att åtgärden ska misslyckas i stället ändrar du standardbeteendet i loopens JSON-definition genom att lägga till parametern med namnet operationOptions och ange värdet till FailWhenLimitsReached, till exempel:

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

I följande exempelarbetsflöde, som börjar kl. 08:00 varje dag, ökar åtgärden Until en variabel tills variabelns värde är lika med 10. Arbetsflödet skickar sedan ett e-postmeddelande som bekräftar det aktuella värdet. I exemplet används Office 365 Outlook, men du kan använda valfri e-postprovider som Azure Logic Apps stöder. Om du använder ett annat e-postkonto förblir de allmänna stegen desamma, men de ser lite annorlunda ut.

  1. I Azure-portalen skapar du en logikappresurs med ett tomt arbetsflöde. Se den tidigare proceduren.

  2. I designverktyget följer du de allmänna stegen för att lägga till den inbyggda Schema-utlösaren med namnet Återkommande i ditt Consumption- eller Standard-arbetsflöde.

  3. I utlösaren Upprepning anger du intervall, frekvens och tidpunkt för när utlösaren ska aktiveras.

    Parameter Värde
    Intervall 1
    Frekvens Dag
    Vid dessa timmar 8
    Vid dessa tidpunkter 00

    Vid dessa tider och Vid dessa minuter visas när du har angett Frekvens till Dag.

    När du är klar ser upprepningsutlösaren ut som i följande exempel:

    Skärmbild som visar Azure-portalen och arbetsflödesdesignern med parametrar för upprepningsutlösare konfigurerade.

  4. Under utlösaren följer du de här allmänna stegen för att lägga till den inbyggda åtgärden Variabler med namnet Initialisera variabler i arbetsflödet för logikappen Consumption eller Standard.

  5. I åtgärden Initiera variabler anger du följande värden:

    Parameter Värde Beskrivning
    Namn Gräns Variabelns namn
    Typ Heltal Din variabels datatyp
    Värde 0 Variabelns startvärde

    Skärmbild som visar Azure-portalen, arbetsflödesdesignern och den inbyggda åtgärden Med namnet Initiera variabel med parametrar.

  6. Under åtgärden Initiera variabler utför du följande allmänna steg för att lägga till den inbyggda åtgärden Kontroll med namnet Until i logikappens arbetsflöde för Consumption eller Standard.

  7. I åtgärden Till anger du följande värden för att konfigurera stoppvillkoret för loopen.

    1. Välj i rutan Loopa till och välj blixtikonen för att öppna listan med dynamiskt innehåll.

    2. I listan under Variabler väljer du variabeln Med namnet Gräns.

    3. Under Antal anger du 10 som jämförelsevärde.

    Skärmbild som visar ett arbetsflöde och en inbyggd åtgärd med namnet Until med de värden som beskrivs.

  8. I åtgärden Till väljer du +>Lägg till en åtgärd.

  9. Följ de här allmänna stegen för att lägga till den inbyggda åtgärden Variabler med namnet Öka variabel i åtgärden Till i arbetsflödet för din Förbrukning- eller Standard-logikapp.

  10. I åtgärden Öka variabel anger du följande värden för att öka värdet för gränsvariabeln med 1:

    Parameter Värde
    Gräns Välj variabeln Gräns .
    Värde 1

    Skärmbilden visar ett arbetsflöde och en inbyggd åtgärd med namnet Until, med Gräns inställt på variabeln Limit och Värde inställt på 1.

  11. Utanför och under åtgärden Till följer du dessa allmänna steg för att lägga till en åtgärd som skickar e-post i arbetsflödet för förbruknings- eller standardlogikappen.

    Det här exemplet fortsätter med office 365 Outlook-åtgärden med namnet Skicka ett e-postmeddelande.

  12. Ange följande värden i e-poståtgärden:

    Parameter Värde Beskrivning
    till < e-address@domain> Mottagarens e-postadress. Använd din egen e-postadress för testning.
    Ämne Aktuellt värde för variabeln "Gräns" är:Gräns E-postämnet. I det här exemplet kontrollerar du att du inkluderar variabeln Gräns för att bekräfta att det aktuella värdet uppfyller ditt angivna villkor:

    1. Välj i rutan Ämne och välj sedan blixtikonen.

    2. Välj Visa mer i listan med dynamiskt innehåll som öppnas bredvid avsnittet Variabler.

    3. Välj Gräns.
    Brödtext < e-postinnehåll> E-postmeddelandets innehåll som du vill skicka. I det här exemplet anger du vilken text du vill.

    När du är klar ser e-poståtgärden ut ungefär som i följande exempel:

    Skärmbild som visar ett arbetsflöde och en åtgärd med namnet Skicka ett e-postmeddelande med egenskapsvärden.

  13. Spara arbetsflödet.

Testa arbetsflödet

Så här testar du logikappens arbetsflöde manuellt:

  • I designerverktygsfältet går du till alternativet Kör och väljer Kör.

När arbetsflödet har börjat köras får du ett e-postmeddelande med det innehåll som du har angett:

Skärmbild som visar exempel på e-post som tagits emot från exempelarbetsflödet.

Förhindra oändliga loopar

Åtgärden Until stoppar körningen baserat på de valfria parametrarna Antal och Tidsgräns. Kontrollera att du anger dessa parametervärden i enlighet med detta:

Parameter Beskrivning
Antal Det maximala antalet iterationer som körs innan loopen avslutas.

För standard- och maxgränser för antalet Till-åtgärder som ett arbetsflöde kan ha, se Begränsningar för samtidighet, loopning och utfasning.
Tidsgräns Den längsta tid som åtgärden Until, inklusive alla iterationer, körs innan loopen avslutas. Det här värdet anges i ISO 8601-format och utvärderas för varje iteration.

Om någon åtgärd i loopen tar längre tid än tidsgränsen stoppas inte den aktuella iterationen. Nästa iteration startar dock inte eftersom tidsgränsvillkoret är uppfyllt.

Standard- och maxgränser för tidsgränsvärdetfinns i Begränsningar för samtidighet, loopning och utfasning.

Granska körningshistorik för Until-loopars iterationer

När du visar körningshistoriken för ett arbetsflöde som innehåller en Until-loop är detaljerad status och resultat för åtgärder i loopen endast tillgängliga när hela loopen har slutfört körningen. Medan Until-loopen fortfarande körs visar loopåtgärden Körs-statusen, men du kan inte expandera eller gå igenom resultaten för de enskilda iterationerna förrän loopen avslutas.

Loopen avslutas när något av följande villkor uppfylls:

  • Det angivna uttrycket utvärderas till sant.
  • Slingan når gränsen för Count.
  • Loopen når gränsen för Timeout.

När loopen har slutförts kan du välja åtgärden Till i körningshistoriken för att visa varje iteration och status för de underordnade åtgärderna i iterationen.

Kommentar

Om din Until-loop körs under en längre period måste du vänta tills loopen har slutförts helt innan du kan kontrollera körningshistoriken efter resultaten från enskilda iterationer. Om du vill övervaka långvariga pågående loopar kan du överväga att lägga till loggnings- eller meddelandeåtgärder i loopen som genererar status oberoende av varandra, till exempel genom att skicka ett meddelande till en kö eller uppdatera en variabel som en parallell gren kan läsa.

"Until"-definition (JSON)

Om du arbetar i kodvyn kan du definiera en Until åtgärd i arbetsflödets JSON-definition, till exempel:

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

I det här exemplet anropar Until-loopen en HTTP-slutpunkt som skapar en resurs. Loopen stoppas när HTTP-svarstexten returneras med Completed status. För att förhindra oändliga loopar stoppas loopen även om något av följande villkor inträffar:

  • Loopen kördes 10 gånger enligt attributet count . Standardvärdet är 60 gånger.

  • Loopen kördes i två timmar enligt timeout attributet i ISO 8601-format. Standardvärdet är en timme.

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