Esegui cicli per ripetere azioni nei flussi di lavoro per App per la logica di Azure

Si applica a: App per la logica di Azure (A consumo e Standard)

Per eseguire le stesse azioni su ogni elemento in un array o una collezione, o ripetere azioni finché qualcosa non si completa nel flusso di lavoro dell'app logica, aggiungi l'azione Control chiamata For each o Until al tuo flusso di lavoro rispettivamente:

Action Attività
Per ciascuno Ripeti una o più azioni sugli elementi di un array o di una raccolta. Si applica solo agli array e alle collezioni.

Consiglio: se hai un trigger che gestisce array e vuoi eseguire un'istanza del flusso di lavoro per ogni elemento dell'array, imposta la proprietà Split on del trigger per suddividere l'array.

Per informazioni, vedere Limiti di concorrenza, looping e suddivisione in batch.
Until Ripeti una o più azioni finché non viene soddisfatta una condizione o uno stato specifico cambia.

Il tuo flusso di lavoro prima esegue tutte le azioni nel ciclo, poi controlla la condizione o lo stato. Se la condizione viene soddisfatta, il ciclo si arresta. In caso contrario, il ciclo viene ripetuto.

Per informazioni, vedi Limiti di Concorrenza, Looping e Dibatting.

Questa guida mostra come aggiungere un ciclo al tuo flusso di lavoro, eseguire iterazioni in sequenza e prevenire cicli infiniti. Vai subito al compito che desideri:

Note

Per la documentazione di Power Automate, vedi Use loops.

Prerequisiti

  • Un account e una sottoscrizione di Azure. Ottenere un account Azure gratuito.

  • Il flusso di lavoro dell'app logica dove vuoi eseguire il ciclo, incluso un trigger che avvia il flusso di lavoro.

    Prima di poter aggiungere un'azione di loop, il tuo flusso di lavoro deve iniziare con un trigger come primo passo.

Questa guida utilizza il portale Azure, ma puoi utilizzare Visual Studio Code e la corrispondente estensione App per la logica di Azure per costruire flussi di lavoro di Logic App:

Per ogni considerazione di loop

L'azione For each ripete una o più azioni per ogni elemento di una matrice o di una raccolta.

  • L'azione Per ogni funziona solo con array e raccolte.

  • Per ogni azione processa un numero limitato di elementi dell'array.

  • Per impostazione predefinita, per ogni azione le iterazioni vengono eseguite in parallelo. Comportamenti chiave da conoscere:

    Behavior Che cosa significa
    Parallelo per impostazione predefinita A differenza del ciclo Apply to each di Power Automate, le iterazioni non vengono eseguite una alla volta.

    Se il tuo scenario richiede un'elaborazione sequenziale, vedi Esegui per ogni iterazione in modo sequenziale. Ad esempio, per mettere in pausa l'iterazione successiva in un'azione Per ogni usando l'azione Ritardo, configura ogni iterazione in modo che venga eseguita in sequenza.
    Cicli annidati Un'azione For each annidata viene sempre eseguita in modo sequenziale. Per eseguire in parallelo, crea e richiama un flusso di lavoro figlio.
    Variables Increment variable, Decrement variable e Append to variable potrebbero restituire risultati imprevedibili in loop paralleli. Per assicurarti che le variabili in un ciclo producano risultati prevedibili dalle operazioni su tali variabili durante ogni iterazione, esegui il ciclo in sequenza.
  • Le azioni in un ciclo For each usano la funzione item() per fare riferimento ed elaborare ogni elemento nella matrice. Se si specificano dati non presenti in una matrice, il flusso di lavoro ha esito negativo.

Aggiungi un ciclo For Each al tuo flusso di lavoro

Il flusso di lavoro di esempio seguente invia un riepilogo giornaliero per un feed RSS del sito Web. Il flusso di lavoro usa un'azione For each che invia un messaggio di posta elettronica per ogni nuovo elemento.

  1. Nel portale di Azure, creare un flusso di lavoro di app per la logica con i passaggi seguenti nell'ordine indicato:

    • Il trigger RSS denominato Quando viene pubblicato un elemento del feed

      Seguire questi passaggi generali per aggiungere un trigger a un flusso di lavoro dell'app per la logica A consumo o Standard.

    • Azione di Outlook.com o Outlook di Office 365 denominata Invia un messaggio di posta elettronica

      Seguire questi passaggi generali per aggiungere un'azione a un flusso di lavoro dell'app per la logica A consumo o Standard.

  2. Nel designer, tra il trigger e l'azione Invia una email , aggiungi l'azione chiamata Per ciascuno seguendo i passaggi generali basati sul tipo di flusso di lavoro:

  3. A questo punto creare il ciclo:

    1. Nel campo Per ogni azione, seleziona all'interno della casella Seleziona un Output Dai Passaggi Precedenti per visualizzare le opzioni di input, poi seleziona l'icona del fulmine.

    2. Nell'elenco dei contenuti dinamici che viene visualizzato, in Quando viene pubblicato un elemento del feed, selezionare Collegamenti feed, che è un output matrice dal trigger RSS.

      Note

      Se l'output Collegamenti feed non viene visualizzato accanto all'etichetta della sezione trigger, selezionare Vedere altro. Dall'elenco dei contenuti dinamici, è possibile selezionare solo output dei passaggi precedenti.

      Screenshot che mostra il portale Azure e il designer del workflow con un'azione chiamata For each e la lista dinamica di contenuti aperta.

      Il seguente esempio mostra l'output dell'array selezionato:

      Schermata che mostra il designer del flusso di lavoro e l'azione denominata For each con l'array di output selezionato.

    3. Per eseguire un'azione esistente su ogni elemento della matrice, trascinare l'azione Invia un messaggio di posta elettronica nel ciclo For each.

      Il tuo flusso di lavoro è il seguente esempio:

      Schermata che mostra il designer del flusso di lavoro, l'azione denominata Per ciascuna e l'azione denominata Invia un'e-mail, ora all'interno dell'azione Per ciascuna.

  4. Salvare il flusso di lavoro.

  5. Per testare manualmente il flusso di lavoro, selezionare Esegui>Esegui nella barra degli strumenti della finestra di progettazione.

Per ogni definizione di azione (JSON)

Se si usa la visualizzazione Codice, è possibile definire l'azione For_each nella definizione JSON del flusso di lavoro, ad esempio:

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

Per ciascuno: esegui le iterazioni del ciclo in sequenza

Per impostazione predefinita, le iterazioni in un'azione Per ogni vengono eseguite contemporaneamente in parallelo. Tuttavia, se sono presenti cicli annidati o variabili all'interno dei cicli dove si attendono risultati prevedibili, è necessario eseguire tali cicli uno alla volta in sequenza.

  1. Nella finestra di progettazione selezionare l'azione Per ogni per aprire il riquadro informazioni e quindi selezionare Impostazioni.

  2. In Controllo della concorrenza, modificare l'impostazione da Disattivato a Attivato.

  3. Spostare il dispositivo di scorrimento Grado di parallelismo su 1.

    Schermata che mostra, per ogni azione, la scheda Impostazioni e l'impostazione Controllo della concorrenza attivata, con il dispositivo di scorrimento del grado di parallelismo impostato su 1.

Definizione dell'azione For each (JSON): eseguire in sequenza

Se si usa la visualizzazione codice con l'azione For_each nella definizione JSON del flusso di lavoro, aggiungere il parametro operationOptions e impostare il valore del parametro su Sequential:

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

Considerazioni sul ciclo Until

L'azione Until esegue e ripete una o più azioni fino a quando non viene soddisfatta la condizione specificata richiesta. Se la condizione viene soddisfatta, il ciclo si arresta. In caso contrario, il ciclo viene ripetuto. Per maggiori informazioni, vedi Limiti di Concorrenza, Looping e Dibattito.

L'elenco seguente contiene alcuni scenari comuni in cui è possibile usare un'azione Until:

  • Chiamare un endpoint finché non si ottiene la risposta desiderata.

  • Creare un record in un database. Attendere finché un campo specifico di tale record non viene approvato. Continuare l'elaborazione.

Per impostazione predefinita, l'azione Fino a ha esito positivo o negativo nei modi seguenti:

  • Il ciclo Until ha esito positivo se tutte le azioni all'interno del ciclo hanno esito positivo e, se viene raggiunto il limite del ciclo, in base al comportamento eseguito dopo l'esecuzione.

  • Se tutte le azioni nell'ultima iterazione del ciclo Until hanno esito positivo, l'intero ciclo Until viene contrassegnato come Succeeded.

  • Se un'azione ha esito negativo nell'ultima iterazione del ciclo Until , l'intero ciclo Until viene contrassegnato come Non riuscito.

  • Se un'azione non riesce in un'iterazione diversa dall'ultima iterazione, l'iterazione successiva continua a essere eseguita e l'intera azione Fino a non viene contrassegnata come Non riuscita.

    Per far sì invece che l'azione non riesca, modificare il comportamento predefinito nella definizione JSON del ciclo aggiungendo il parametro denominato operationOptionse impostando il valore su FailWhenLimitsReached, ad esempio:

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

Aggiungi un ciclo Until al tuo flusso di lavoro

Il seguente esempio di flusso di lavoro inizia ogni giorno alle 8:00. Il flusso di lavoro utilizza l'azione Until per incrementare una variabile fino a che il valore non raggiunge 10. Il flusso di lavoro invia quindi un messaggio di posta elettronica che conferma il valore corrente. L'esempio usa Office 365 Outlook, ma è possibile usare qualsiasi provider di posta elettronica supportato da App per la logica di Azure. Se si usa un altro account di posta elettronica, la procedura generale resta invariata, ma sembra leggermente diversa.

  1. Nel portale di Azure creare una risorsa dell'app per la logica con un flusso di lavoro vuoto.

  2. Nel designer, aggiungi il trigger integrato Schedulechiamato Recurrence seguendo i passaggi generali basati sul tipo di workflow:

  3. Nel trigger Ricorrenza , fornisci le seguenti informazioni:

    Parametro valore
    Interval 1
    Frequenza Day
    A queste ore 8
    A questi minuti 00

    In queste ore e In questi minuti vengono visualizzati dopo aver impostato Frequenza su Giorno.

    Il seguente esempio mostra come appare il trigger di Recidiva :

    Screenshot che mostra il portale Azure e il designer del workflow con i parametri del trigger di ricorrenza impostati.

  4. Nel designer, aggiungi l'azione integrata Variabilichiamata Inizializza variabile seguendo i passaggi generali basati sul tipo di workflow:

  5. Nell'azione Inizializza variabile , fornisci le seguenti informazioni:

    Parametro valore Descrizione
    Nome Limite Il nome della tua variabile.
    Tipo Integer Il tipo di dato della tua variabile.
    Valore 0 Il valore iniziale della tua variabile.

    Screenshot che mostra il portale Azure, il designer del workflow e l'azione integrata chiamata Inizializza variabile, più i parametri.

  6. Sotto l'azione Inizializza variabile , aggiungi l'azione integrata Controlchiamata Until seguendo i passaggi generali basati sul tipo di workflow:

  7. Nell'azione Until, configura la condizione di arresto per il ciclo:

    1. Seleziona all'interno del riquadro Loop Until, quindi seleziona l'icona del fulmine per aprire l'elenco del contenuto dinamico.

    2. Nell'elenco, in Variabili, selezionare la variabile denominata Limit.

    3. In Conteggio immettere 10 come valore di confronto.

    Screenshot che mostra il flusso di lavoro e un'azione integrata chiamata Until con i valori descritti.

  8. All'interno dell'azione Fino a selezionare +>Aggiungere un'azione.

  9. Aggiungi l'azione integrata Variabili chiamata variabile Increment all'azione Until seguendo i passaggi generali basati sul tipo di workflow:

  10. Nell'azione Incrementa variabile, specificare i valori seguenti per incrementare il valore della variabile Limit di 1:

    Parametro valore
    Limite Selezionare la variabile Limit.
    Valore 1

    Uno screenshot che mostra il flusso di lavoro e un'azione integrata chiamata Until con Limit impostato su Limit variabile e Value impostato su 1.

  11. All'esterno e sotto l'azione Until, aggiungi un'azione che invii un messaggio di posta elettronica seguendo i passaggi generali in base al tipo di flusso di lavoro:

    Questo esempio continua con l'azione Outlook di Office 365 denominata Invia un messaggio di posta elettronica.

  12. Nell'azione di posta elettronica, specificare i valori seguenti:

    Parametro valore Descrizione
    To < indirizzo e-mail@dominio> Indirizzo e-mail del destinatario. Per il test è possibile usare l'indirizzo di posta elettronica personale.
    Oggetto Il valore corrente della variabile "Limit" è:Limite L'oggetto del messaggio di posta elettronica. Per questo esempio, assicurarsi di includere la variabile Limit per verificare che il valore corrente soddisfi la condizione specificata:

    1. Selezionare all'interno della casella Oggetto e quindi selezionare l'icona a forma di fulmine.

    2. Nell'elenco di contenuti dinamici che viene visualizzato, accanto all'intestazione della sezione Variabili, selezionare Visualizza altro.

    3. Selezionare Limite.
    Corpo < email-content> Il contenuto del messaggio di posta elettronica da inviare. Per questo esempio, immettere un testo desiderato.

    Il seguente esempio mostra come appare la tua azione email:

    Screenshot che mostra un flusso di lavoro e un'azione chiamata Invia un'email con i valori delle proprietà.

  13. Salvare il flusso di lavoro.

Testare il flusso di lavoro

Per testare manualmente il flusso di lavoro dell'app per la logica:

  • Sulla barra degli strumenti della finestra di progettazione, dall'opzione Esegui selezionare Esegui.

Dopo l'avvio dell'esecuzione del flusso di lavoro, viene visualizzato un messaggio di posta elettronica con il contenuto specificato:

Screenshot che mostra un'email di esempio ricevuta da un flusso di lavoro di esempio.

Evitare i cicli infiniti

L'azione Fino a arresta l'esecuzione in base ai parametri facoltativi Conteggio e Timeout. Assicurarsi di impostare questi valori dei parametri di conseguenza:

Parametro Descrizione
Numero Il numero massimo di iterazioni eseguite prima della chiusura del ciclo.

Per i limiti massimi e predefiniti del numero delle azioni Until di cui può disporre un flusso di lavoro, vedere Limiti di concorrenza, cicli e debatching.
Timeout Periodo massimo di tempo durante il quale l'azione Until, incluse tutte le iterazioni, viene eseguita prima dell'uscita del ciclo. Questo valore viene specificato in formato ISO 8601 e viene valutato per ogni iterazione.

Se un'azione del ciclo richiede più tempo di quello previsto dal limite di timeout, l'iterazione corrente non viene arrestata. L'iterazione successiva non viene tuttavia avviata perché non viene soddisfatta la condizione limite del timeout.

Per i limiti massimi e predefiniti del valore Timeout, vedere Limiti di concorrenza, cicli e debatching.

Esamina la cronologia di esecuzione delle iterazioni del ciclo Until

Quando si visualizza la cronologia di esecuzione per un flusso di lavoro che include un ciclo Until , lo stato dettagliato e i risultati per le azioni all'interno del ciclo sono disponibili solo dopo il completamento dell'esecuzione dell'intero ciclo. Mentre il ciclo Until continua a eseguire le iterazioni, l'azione del ciclo mostra lo stato In esecuzione , ma non è possibile espandere o attraversare i singoli risultati dell'iterazione fino all'uscita del ciclo.

Il ciclo viene chiuso quando viene soddisfatta una delle condizioni seguenti:

  • L'espressione specificata restituisce true.
  • Il ciclo raggiunge il limite Count.
  • Il ciclo raggiunge il limite di timeout .

Al termine del ciclo, è possibile selezionare l'azione Until nella cronologia di esecuzione per visualizzare ogni iterazione e lo stato delle azioni figlio all'interno di tale iterazione.

Note

Se il ciclo Until viene eseguito per un periodo prolungato, è necessario attendere il completamento completo del ciclo prima di poter esaminare la cronologia di esecuzione per i risultati delle singole iterazioni. Per monitorare cicli a esecuzione prolungata, è consigliabile aggiungere azioni di registrazione o notifica all'interno del ciclo che generano in modo indipendente lo stato, ad esempio inviando un messaggio a una coda o aggiornando una variabile che un ramo parallelo può leggere.

Fino alla definizione dell'azione (JSON)

Se si usa la visualizzazione Codice, è possibile definire un'azione Until nella definizione JSON del flusso di lavoro, ad esempio:

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

Questo ciclo Until di esempio chiama un endpoint HTTP, che crea una risorsa. Il ciclo si arresta quando il corpo della risposta HTTP restituisce lo stato Completed. Per evitare i cicli infiniti, il ciclo viene arrestato anche se si verifica una delle condizioni seguenti:

  • Il ciclo è stato eseguito 10 volte, come specificato dall'attributo count. Il valore predefinito è 60 volte.

  • Il ciclo è stato eseguito per due ore, come specificato dall'attributo timeout in formato ISO 8601. Il valore predefinito è un'ora.

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

Passaggi successivi