Creare cicli per ripetere le azioni nei flussi di lavoro con App per la logica di Azure

Si applica a: App per la logica di Azure (consumo + standard)

App per la logica di Azure include le azioni del ciclo seguenti che è possibile usare nel flusso di lavoro:

  • Per ripetere una o più azioni sugli elementi di una matrice, aggiungere l'azione For each al flusso di lavoro.

    In alternativa, se si dispone di un trigger che riceve una matrice e si vuole eseguire un'iterazione per ogni elemento della matrice, è possibile annullare il debatch della matrice con la proprietà trigger SplitOn.

  • Per ripetere una o più azioni fino a quando non viene soddisfatta una condizione o una modifica dello stato, aggiungere l'azione Until al flusso di lavoro.

    Il flusso di lavoro esegue prima tutte le azioni all'interno del ciclo e quindi controlla la condizione o lo stato. Se la condizione viene soddisfatta, il ciclo si arresta. In caso contrario, il ciclo viene ripetuto. Per i limiti predefiniti e massimi per il numero di cicli Until che un flusso di lavoro può avere, vedere Limiti di concorrenza, ciclo e debatching.

Prerequisiti

Per ogni

L'azione For each funziona solo su matrici e ripete una o più azioni su ogni elemento di una matrice. L'elenco seguente contiene alcune considerazioni relative all'uso di un'azione For each :

  • L'azione For each può elaborare un numero limitato di elementi di matrice. Per questo limite, vedere Concorrenza, ciclo e limiti di debatching.

  • Per impostazione predefinita, i cicli o le iterazioni in un'azione Per ogni azione vengono eseguiti contemporaneamente in parallelo.

    Questo comportamento è diverso da Applica a ogni ciclo di Power Automate in cui le iterazioni vengono eseguite una alla volta o in sequenza. Tuttavia, è possibile configurare sequenziale Per ogni iterazione. Ad esempio, se si vuole sospendere l'iterazione successiva in un'azione For each usando l'azione Ritardo, è necessario configurare ogni iterazione per l'esecuzione sequenziale.

    Come eccezione al comportamento predefinito, le iterazioni di ogni azione vengono sempre eseguite in sequenza, non in parallelo. Per eseguire operazioni in parallelo per gli elementi in un ciclo annidato, creare e chiamare un flusso di lavoro dell'app per la logica figlio.

  • Per ottenere risultati prevedibili dalle operazioni sulle variabili durante ogni iterazione, eseguire le iterazioni in sequenza. Ad esempio, quando termina un'iterazione contemporaneamente in esecuzione, la variabile Increment, la variabile Decrement e Le operazioni Append to variable restituiscono risultati prevedibili. Tuttavia, durante ogni iterazione del ciclo in esecuzione simultanea, queste operazioni potrebbero restituire risultati imprevisti.

  • Le azioni in un ciclo For each usano la item() funzione per fare riferimento ed elaborare ogni elemento nella matrice. Se si specificano dati non inclusi in una matrice, il flusso di lavoro ha esito negativo.

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

In base al fatto che si disponga di un flusso di lavoro a consumo o Standard, seguire i passaggi corrispondenti:

  1. Nella portale di Azure creare un flusso di lavoro dell'app per la logica a consumo di esempio con i passaggi seguenti nell'ordine specificato:

  2. Seguire gli stessi passaggi generali per aggiungere l'azione For each tra il trigger RSS e l'azione Invia un messaggio di posta elettronica nel flusso di lavoro.

  3. Compilare ora il ciclo:

    1. Selezionare all'interno della casella Selezionare un output dei passaggi precedenti in modo che venga aperto l'elenco di contenuto dinamico.

    2. Nell'elenco Aggiungi contenuto dinamico, nella sezione When a feed item is published (Quando viene pubblicato un elemento feed) selezionare Feed links (Collegamenti feed), ovvero un output di matrice dal trigger RSS.

      Nota

      Se l'output dei collegamenti feed non viene visualizzato, accanto all'etichetta della sezione trigger selezionare Vedi altro. Dall'elenco di contenuto dinamico è possibile selezionare solo gli output dei passaggi precedenti.

      Screenshot shows Azure portal, Consumption workflow designer, action named For each, and opened dynamic content list.

      Al termine, l'output della matrice selezionato viene visualizzato come nell'esempio seguente:

      Screenshot shows Consumption workflow, action named For each, and selected array output.

    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 flusso di lavoro sarà ora simile all'esempio seguente:

      Screenshot shows Consumption workflow, action named For each, and action named Send an email, now inside For each loop.

  4. Al termine, salvare il flusso di lavoro.

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

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 ognuno: Eseguire in sequenza

Per impostazione predefinita, le iterazioni in un ciclo For each vengono eseguite contemporaneamente in parallelo. Tuttavia, quando sono presenti cicli o variabili annidati all'interno dei cicli in cui si prevedono risultati prevedibili, è necessario eseguire questi cicli uno alla volta o in sequenza.

  1. Nell'angolo in alto a destra di ogni azione selezionare puntini di sospensione (...) >Impostazioni.

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

  3. Spostare il dispositivo di scorrimento Degree of Parallelism su 1 e selezionare Fine.

    Screenshot shows Consumption workflow, action named For each, concurrency control setting turned on, and degree of parallelism slider set to 1.

Per ogni definizione di azione (JSON): eseguire in sequenza

Se si usa la visualizzazione codice con l'azione For_each nella definizione JSON del flusso di lavoro, è possibile usare l'opzione Sequential aggiungendo il operationOptions parametro , ad esempio:

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

Fino a

L'azione Until viene eseguita 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 i limiti predefiniti e massimi per il numero di azioni o iterazioni fino a quando un flusso di lavoro può avere, vedere Limiti di concorrenza, ciclo e debatching.

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.

Nel flusso di lavoro di esempio seguente, a partire dalle 8:00 ogni giorno, l'azione Until incrementa una variabile fino a quando il valore della variabile è uguale a 10. Il flusso di lavoro invia quindi un messaggio di posta elettronica che conferma il valore corrente.

Nota

In questo esempio viene usato Office 365 Outlook, ma è possibile usare qualsiasi provider di posta elettronica supportato App per la logica di Azure. Se si usa un altro account di posta elettronica, la procedura generale resta invariata, ma l'interfaccia utente potrebbe essere leggermente diversa.

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

  2. Nella finestra di progettazione seguire questa procedura generale per aggiungere il trigger predefinito Ricorrenza denominato Pianificazione al flusso di lavoro.

  3. Nel trigger Ricorrenza specificare l'intervallo, la frequenza e l'ora del giorno per l'attivazione del trigger.

    Proprietà valore
    Intervallo 1
    Frequenza Giornaliera
    A queste ore 8

    Per aggiungere il parametro At these hours , aprire l'elenco Aggiungi nuovo parametro e selezionare In queste ore, che viene visualizzato solo dopo aver impostato Frequenza su Giorno.

    Screenshot shows Azure portal, Consumption workflow designer, and Recurrence trigger parameters with selected option for At these hours.

    Al termine, il trigger Ricorrenza è simile all'esempio seguente:

    Screenshot shows Azure portal, Consumption workflow, and Recurrence trigger parameters set up.

  4. Nel trigger seguire questa procedura generale per aggiungere l'azione predefinita Variabili denominata Inizializza variabile al flusso di lavoro.

  5. Nell'azione Inizializza variabile specificare i valori seguenti:

    Proprietà valore Descrizione
    Nome Limite Nome della variabile
    Type Integer Nome del tipo di dati della variabile
    valore 0 Valore iniziale della variabile

    Screenshot shows Azure portal, Consumption workflow, and parameters for built-in action named Initialize variable.

  6. Nell'azione Inizializza variabile seguire questa procedura generale per aggiungere l'azione predefinita Controllo denominata Until al flusso di lavoro.

  7. Nell'azione Until specificare i valori seguenti per configurare la condizione di arresto per il ciclo.

    1. Selezionare all'interno della casella più a sinistra denominata Scegli un valore, che apre automaticamente l'elenco di contenuto dinamico.

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

    3. Nell'elenco degli operatori intermedi selezionare l'operatore uguale a .

    4. Nella casella più a destra denominata Scegliere un valore immettere 10 come valore di confronto.

    Screenshot shows Consumption workflow and built-in action named Until with finished stop condition.

  8. All'interno dell'azione Until selezionare Aggiungi un'azione.

  9. Nella casella di ricerca Scegliere un'operazione seguire questa procedura generale per aggiungere l'azione predefinita Variabili denominata Increment variabile all'azione Until.

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

    Proprietà valore
    Nome Selezionare la variabile Limite .
    valore 1

    Screenshot shows Consumption workflow and built-in action named Until with Name set to the Limit variable and Value set to 1.

  11. All'esterno e in Azione Until seguire questa procedura generale per aggiungere un'azione che invia un messaggio di posta elettronica.

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

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

    Proprietà valore Descrizione
    Per <address@domain di posta elettronica> Indirizzo e-mail del destinatario. Per il test è possibile usare l'indirizzo di posta elettronica personale.
    Argomento Il valore corrente per la variabile "Limit" è:Limit 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 in modo che venga visualizzato l'elenco di contenuto dinamico.

    2. Nell'elenco di contenuto dinamico, accanto all'intestazione della sezione Variabili , selezionare Visualizza altro.

    3. Selezionare Limite.
    Testo <contenuto del messaggio di posta elettronica> Contenuto del messaggio di posta elettronica da inviare. Per questo esempio, immettere il testo desiderato.

    Al termine, l'azione di posta elettronica sarà simile all'esempio seguente:

    Screenshot shows Consumption workflow and action named Send an email with property values.

  13. Salvare il flusso di lavoro.

Testare il flusso di lavoro

Per testare manualmente il flusso di lavoro dell'app per la logica, seguire la procedura in base alla presenza di un'app per la logica a consumo o standard.

Sulla barra degli strumenti della finestra di progettazione selezionare Esegui esecuzione trigger>.

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

Screenshot shows sample email received from example workflow.

Evitare i cicli infiniti

L'azione Until arresta l'esecuzione in base alle proprietà seguenti, che è possibile visualizzare selezionando Modifica limiti nell'azione. Assicurarsi di impostare questi valori delle proprietà di conseguenza:

Proprietà Descrizione
Conteggio Numero massimo di iterazioni eseguite prima dell'uscita del ciclo.

Per i limiti predefiniti e massimi per il numero di azioni Fino a quando un flusso di lavoro può avere, vedere Limiti di concorrenza, ciclo e debatching.
Timeout Tempo massimo di esecuzione dell'azione Until , incluse tutte le iterazioni, prima dell'uscita del ciclo. Questo valore viene specificato nel formato ISO 8601 e viene valutato per ogni iterazione.

Se un'azione nel ciclo richiede più tempo del limite di timeout, l'iterazione corrente non si arresta. Tuttavia, l'iterazione successiva non viene avviata perché viene soddisfatta la condizione del limite di timeout.

Per i limiti predefiniti e massimi per il valore di timeout , vedere Concorrenza, ciclo e limiti di debatching.

Definizione di "Until" (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"
         ]
      }
   }
}

In questo esempio il ciclo Until chiama un endpoint HTTP, che crea una risorsa. Il ciclo si arresta quando il corpo della risposta HTTP restituisce lo stato Completed. Per evitare cicli infiniti, il ciclo si interrompe 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",
               "body": {
                  "resourceId": "@triggerBody()"
               }
            },
            "runAfter": {},
            "type": "ApiConnection"
         }
      },
      "expression": "@equals(triggerBody(), 'Completed')",
      "limit": {
         "count": 10,
         "timeout": "PT2H"
      },
      "runAfter": {}
   }
}

Passaggi successivi