Ejecutar bucles para repetir acciones en flujos de trabajo para Azure Logic Apps

Se aplica a: Azure Logic Apps (consumo + estándar)

Para ejecutar las mismas acciones en cada elemento de un array o colección, o repetir acciones hasta que algo termine en el flujo de trabajo de tu app lógica, añade la acción Control llamada For each o Until a tu flujo de trabajo respectivamente:

Action Tarea
Para cada uno Repite una o más acciones en los elementos de una matriz o colección. Se aplica solo a las matrices y las colecciones.

Consejo: Si tienes un desencadenador que controla matrices y quieres ejecutar una instancia de un flujo de trabajo para cada elemento de la matriz, configura la propiedad Split on del desencadenador para dividir en lotes la matriz.

Para más información, véase Límites de concurrencia, bucle y debate.
Until Repite una o más acciones hasta que se cumpla una condición o cambie un estado específico.

Tu flujo de trabajo primero ejecuta todas las acciones del bucle y luego comprueba la condición o estado. Si se cumple la condición, se detiene el bucle. En caso contrario, se repite el bucle.

Para más información, véase Límites de concurrencia, bucle y debate.

Esta guía muestra cómo añadir un bucle a tu flujo de trabajo, ejecutar iteraciones secuencialmente y evitar bucles interminables. Salta a la tarea que quieres:

Nota:

Para la documentación de Power Automate, véase Bucles de uso.

Requisitos previos

  • Una cuenta y una suscripción de Azure. Obtenga una cuenta gratuita de Azure.

  • El flujo de trabajo de la app lógica donde quieres ejecutar el bucle, incluyendo un disparador que inicia el flujo de trabajo.

    Antes de poder añadir una acción de bucle, tu flujo de trabajo debe comenzar con un disparador como primer paso.

Esta guía utiliza el portal de Azure, pero puedes usar Visual Studio Code y la correspondiente extensión Azure Logic Apps para crear flujos de trabajo de Logic App:

Para consideraciones de cada bucle

La acción Para cada repite una o varias acciones para cada elemento de una matriz o colección.

  • La acción Para cada solo funciona con matrices y colecciones.

  • Para cada acción procesa un número limitado de elementos del array.

  • Por defecto, para cada acción las iteraciones se ejecutan en paralelo. Comportamientos clave a conocer:

    Comportamiento Qué significa
    Paralelo por defecto A diferencia de Apply to every loop de Power Automate, las iteraciones no se ejecutan una a una.

    Si tu escenario necesita procesamiento secuencial, consulta Ejecutar para cada iteración secuencialmente. Por ejemplo, para pausar la siguiente iteración en una acción Para cada mediante la acción Retraso, configura cada iteración para que se ejecute de forma secuencial.
    Bucles anidados Una acción Para cada anidada siempre se ejecuta secuencialmente. Para ejecutar en paralelo, crea e invoca un flujo de trabajo hijo.
    Variables Incrementar variable, Reducir variable y Anexar a la variable pueden producir resultados impredecibles en bucles paralelos. Para asegurarse de que las variables en un bucle produzcan resultados predecibles a partir de las operaciones sobre esas variables durante cada iteración, ejecuta el bucle secuencialmente.
  • Las acciones de un bucle For each usan la función item() para hacer referencia y procesar cada elemento de la matriz. Si especifica datos que no están en una matriz, se producirá un error en el flujo de trabajo.

Añade un bucle For Each a tu flujo de trabajo

Este ejemplo de flujo de trabajo envía un resumen diario de una fuente RSS de sitio web. El flujo de trabajo utiliza una acción For each que envía un correo electrónico por cada nuevo elemento.

  1. En Azure Portal, cree un flujo de trabajo de aplicación lógica con los pasos siguientes en el orden especificado:

    • El desencadenador RSS denominado When a feed item is published (Cuando se publica un elemento de fuente)

      Siga estos pasos generales para agregar un desencadenador a un flujo de trabajo de aplicación lógica de Consumo o Estándar.

    • Acción de Outlook.com o Outlook de Office 365 denominada Enviar un correo electrónico

      Siga estos pasos generales para agregar una acción a un flujo de trabajo de consumo de aplicación lógica de Consumo o Estándar.

  2. En el diseñador, entre el desencadenador y la acción Enviar un correo electrónico, agrega la acción llamada Para cada siguiendo los pasos generales según el tipo de flujo de trabajo:

  3. Ahora, compile el bucle:

    1. En la sección Para cada acción, selecciona dentro del cuadro Seleccionar una salida de pasos anteriores para ver las opciones de entrada, y luego selecciona el icono de rayo.

    2. En la lista de contenido dinámico que se abre, en Cuando se publica un elemento de fuente, seleccione Vínculos de fuente, que es una salida de matriz del desencadenador de RSS.

      Nota:

      Si la salida de vínculos de fuente no aparece, junto a la etiqueta de sección del desencadenador, seleccione Ver más. En la lista de contenido dinámico, solo puede seleccionar salidas de los pasos anteriores.

      Captura de pantalla que muestra el portal de Azure y el diseñador de flujos de trabajo con una acción llamada Para cada uno y la lista de contenido dinámico abierta.

      El siguiente ejemplo muestra la salida seleccionada del array:

      Captura de pantalla que muestra el diseñador de flujos de trabajo y la acción llamada Para cada con la salida de la matriz seleccionada.

    3. Para ejecutar una acción en cada elemento de matriz, arrastre la acción Enviar un correo electrónico al bucle For each.

      Tu flujo de trabajo es el siguiente ejemplo:

      Captura de pantalla que muestra al diseñador del flujo de trabajo, la acción llamada Para cada uno y la acción llamada Enviar un correo, ahora dentro de Para cada acción.

  4. Guarde el flujo de trabajo.

  5. Para probar manualmente el flujo de trabajo, en la barra de herramientas del diseñador, seleccione Ejecución>.Ejecutar

Para cada definición de acción (JSON)

Si está trabajando en la vista de código, defina la acción For_each en la definición JSON de su flujo de trabajo, por ejemplo:

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

Para cada una: ejecutar iteraciones de bucles de forma secuencial

De forma predeterminada, las iteraciones de una acción For each se ejecutan al mismo tiempo en paralelo. Sin embargo, si tiene bucles anidados o tiene variables dentro de bucles en los que espera resultados predecibles, debe ejecutar esos bucles uno a uno secuencialmente.

  1. En el diseñador, seleccione la acción For each para abrir el panel de información y, a continuación, seleccione Configuración.

  2. En el Control de simultaneidad, cambie la configuración de Desactivado a Activado.

  3. Mueva el control deslizante Grado de paralelismo a 1.

    Captura de pantalla que muestra la acción Para cada, la pestaña Configuración y la configuración de Control de concurrencia activada, con el control deslizante de Grado de paralelismo establecido en 1.

Para cada definición de acción (JSON): ejecutar secuencialmente

Si está trabajando en la vista de código con la acción For_each en la definición JSON del flujo de trabajo, agregue el parámetro operationOptions y establezca el valor del parámetro en Sequential:

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

Consideraciones sobre el bucle Until

La acción Until se ejecuta y repite una o varias acciones hasta que se cumpla la condición especificada necesaria. Si se cumple la condición, se detiene el bucle. En caso contrario, se repite el bucle. Para más información, véase Límites de concurrencia, bucle y debate.

La lista siguiente contiene algunos escenarios comunes en los que puede usar una acción Until:

  • Llamada a un punto de conexión hasta obtener la respuesta que quiere.

  • Creación de un registro en una base de datos. Espere hasta que un campo específico de ese registro sea aprobado. Continúe el procesamiento.

De forma predeterminada, la acción Until se realiza correctamente o produce un error de las siguientes maneras:

  • El bucle Until se realiza correctamente si todas las acciones dentro del bucle se completan exitosamente, y si se alcanza el límite del bucle, basado en el comportamiento post-ejecución.

  • Si todas las acciones de la última iteración del bucle Until se realizan correctamente, todo el bucle Until se marca como Correcto.

  • Si se produce un error en cualquier acción en la última iteración del bucle Until , el bucle Until completo se marca como Failed.

  • Si se produce un error en cualquier acción en una iteración distinta de la última iteración, la siguiente iteración continúa ejecutándose y la acción Until completa no se marca como Errónea.

    Para que se produzca un error en la acción en su lugar, cambie el comportamiento predeterminado en la definición JSON del bucle agregando el parámetro denominado operationOptions y estableciendo el valor en FailWhenLimitsReached, por ejemplo:

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

Añade un bucle Until a tu flujo de trabajo

El siguiente ejemplo de flujo de trabajo comienza a las 8:00 AM cada día. El flujo de trabajo utiliza la acción Hasta incrementar una variable hasta que el valor sea igual a 10. El flujo de trabajo envía después un correo electrónico que confirma el valor actual. En el ejemplo se usa Office 365 Outlook, pero puede usar cualquier proveedor de correo electrónico compatible con Azure Logic Apps. Si usa otra cuenta de correo electrónico, los pasos generales permanecen iguales, pero tienen un aspecto ligeramente diferente.

  1. En Azure Portal, cree un recurso de aplicación lógica con un flujo de trabajo en blanco.

  2. En el diseñador, añade el disparador integrado Schedule llamado Recurrence siguiendo los pasos generales según el tipo de flujo de trabajo:

  3. En el desencadenador Recurrencia, proporcione la siguiente información:

    Parámetro Importancia
    Intervalo 1
    Frecuencia Day
    A estas horas 8
    En estos minutos 00

    En estas horas y En estos minutos aparecen después de establecer Frecuencia en Día.

    El siguiente ejemplo muestra cómo aparece el disparador de recurrencia :

    Captura de pantalla que muestra el portal de Azure y el diseñador de flujo de trabajo con los parámetros del desencadenador de periodicidad establecidos.

  4. En el diseñador, añade la acción integrada Variables llamada Inicializar variable siguiendo los pasos generales según el tipo de flujo de trabajo:

  5. En la acción Inicializar variable , proporciona la siguiente información:

    Parámetro Importancia Descripción
    Nombre Límite El nombre de tu variable.
    Tipo Entero El tipo de dato de tu variable.
    Valor 0 El valor inicial de tu variable.

    Captura de pantalla que muestra el portal de Azure, el diseñador de flujos de trabajo y la acción incorporada llamada Inicializar variable, más los parámetros.

  6. En la acción Inicializar variable , añade la acción integrada Control llamada Hasta siguiendo los pasos generales según el tipo de flujo de trabajo:

  7. En la acción Until, establece la condición de detención del bucle:

    1. Selecciona dentro de la caja Loop Until y luego selecciona el icono de rayo para abrir la lista de contenido dinámico.

    2. En la lista, en Variables, seleccione la variable denominada Limit.

    3. En Recuento, escriba 10 como valor de comparación.

    Captura de pantalla que muestra el flujo de trabajo y una acción incorporada llamada Until con los valores descritos.

  8. Dentro de la acción Until, seleccione +>Agregar una acción.

  9. Añade la acción incorporada Variables llamada variable Increment a la acción Until siguiendo los pasos generales según el tipo de flujo de trabajo:

  10. En la acción Incrementar variable, proporcione los siguientes valores para incrementar el valor de la variable Limit 1 punto:

    Parámetro Importancia
    Límite Seleccione la variable Limit.
    Valor 1

    Captura de pantalla que muestra el flujo de trabajo y una acción incorporada llamada Hasta con Límite configurado a Límite variable y Valor a 1.

  11. Fuera de la acción Hasta y debajo de ella, añade una acción que envíe un correo electrónico siguiendo los pasos generales según el tipo de flujo de trabajo:

    Este ejemplo continúa con la acción de Office 365 Outlook denominada Enviar correo electrónico.

  12. En la acción de correo electrónico, proporcione los valores siguientes:

    Parámetro Importancia Descripción
    To < email-address@domain> La dirección de correo electrónico del destinatario. Para las pruebas, use su propia dirección de correo electrónico.
    Asunto El valor actual de la variable "Limit" es:Limit El asunto del correo electrónico. En este ejemplo, asegúrese de incluir la variable Limit para confirmar que el valor actual cumple la condición especificada:

    1. Seleccione dentro del cuadro Asunto y, a continuación, seleccione el icono de rayo.

    2. En la lista de contenido dinámico que se abre, junto al encabezado de sección Variables, seleccione Ver más.

    3. Seleccione Límite.
    Cuerpo < Contenido de correo electrónico> El contenido del mensaje de correo electrónico que quiere enviar. En este ejemplo, escriba cualquier texto que desee.

    El siguiente ejemplo muestra cómo aparece tu acción de correo electrónico:

    Captura de pantalla que muestra un flujo de trabajo y una acción llamada Enviar un correo electrónico con los valores de las propiedades.

  13. Guarde el flujo de trabajo.

Pruebe el flujo de trabajo

Para probar manualmente el flujo de trabajo de la aplicación lógica:

  • En la barra de herramientas del diseñador, en la opción Ejecución, seleccione Ejecutar.

Después de que el flujo de trabajo empiece a ejecutarse, recibirá un correo electrónico con el contenido que haya especificado:

Captura de pantalla que muestra un correo electrónico de ejemplo recibido de un flujo de trabajo de ejemplo.

Impedir bucles sin fin

La acción Until detiene la ejecución en función de los parámetros Count y Timeout opcionales. Asegúrese de establecer estos valores de parámetro en consecuencia:

Parámetro Descripción
Recuento El número máximo de iteraciones que se ejecutan antes de salir del bucle.

Para conocer los límites predeterminados y máximos del número de acciones Until que puede tener la ejecución de un flujo de trabajo, consulte Límites de simultaneidad, bucle y anulación de procesamiento por lotes.
Tiempo de espera Cantidad máxima de tiempo que la acción Until, incluidas todas las iteraciones, se ejecuta antes de que se cierre el bucle. Este valor se especifica en formato ISO 8601 y se evalúa para cada iteración.

Si cualquier acción en el bucle tarda más que el límite de tiempo de expiración, la iteración actual no se detiene. Sin embargo, la siguiente iteración no comienza porque se cumple la condición de límite de tiempo de espera.

Para obtener los límites predeterminados y máximos en el valor Timeout, consulteLímites de simultaneidad, bucle y anulación de procesamiento por lotes.

Revisar el historial de ejecuciones de las iteraciones del bucle Until

Al ver el historial de ejecución de un flujo de trabajo que incluye un bucle Until , el estado detallado y los resultados de las acciones dentro del bucle solo están disponibles después de que todo el bucle complete su ejecución. Aunque el bucle Until sigue ejecutando sus iteraciones, la acción del bucle muestra el estado En ejecución, pero no se pueden expandir ni recorrer los resultados de iteración individuales hasta que se cierre el bucle.

El bucle se cierra cuando se cumple una de las condiciones siguientes:

  • La expresión especificada se evalúa como true.
  • El bucle alcanza el límite Count.
  • El bucle alcanza el límite de tiempo de espera .

Una vez completado el bucle, puede seleccionar la acción Hasta en el historial de ejecución para ver cada iteración y el estado de las acciones secundarias dentro de esa iteración.

Nota:

Si el bucle Until se ejecuta durante un período prolongado, debe esperar a que el bucle se complete por completo antes de poder inspeccionar el historial de ejecución de los resultados de iteraciones individuales. Para supervisar bucles de larga duración, en curso, considere la posibilidad de agregar acciones de registro o notificación dentro del bucle que emiten el estado de forma independiente, por ejemplo, enviando un mensaje a una cola o actualizando una variable que una rama paralela puede leer.

Definición de la acción Until (JSON)

Si está trabajando en la vista de código, defina la acción Until en la definición JSON de su flujo de trabajo, por ejemplo:

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

El bucle Until de este ejemplo llama a un punto de conexión HTTP, que crea un recurso. El bucle se detiene cuando se devuelve el cuerpo de la respuesta HTTP con el estado Completed. Para impedir bucles sin fin, el bucle también se detendrá si se produce alguna de estas condiciones:

  • El bucle se ha ejecutado 10 veces según lo especificado por el atributo count. El valor predeterminado es 60 veces.

  • El bucle se ejecutó durante dos horas según lo especificado por el atributo timeout en formato ISO 8601. El valor predeterminado es de una hora.

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

Pasos siguientes