Loop

Repite bloques varias veces con control de iteraciones

El bloque Loop es un contenedor que ejecuta repetidamente los bloques que contiene. No es un bloque normal con su propio archivo de origen: es un nodo contenedor especial gestionado por el LoopBlockHandler del ejecutor. Arrastra bloques al contenedor del bucle y se ejecutarán una vez por iteración.

Los bloques Loop son nodos contenedor. Arrastra los bloques secundarios dentro del bucle en el lienzo. Las conexiones entrantes llegan a través de Loop Start, y las salidas secundarias se reconectan a Loop End antes de que el flujo de trabajo continúe fuera del bucle.

Tipos de Loop

Bucle For -- se ejecuta un número fijo de veces. El número de iteraciones predeterminado es 5 si no se especifica.

Example: Run 3 times
- Iteration 1 (index 0)
- Iteration 2 (index 1)
- Iteration 3 (index 2)

Bucle ForEach -- itera sobre cada elemento de un arreglo u objeto. La colección debe ser no vacía; una colección vacía lanza un error.

Example: Process ["apple", "banana", "orange"]
- Iteration 1: currentItem = "apple"
- Iteration 2: currentItem = "banana"
- Iteration 3: currentItem = "orange"

Para los objetos, cada iteración recibe un par [key, value].

Bucle While -- evalúa una condición antes de cada iteración. Si la condición es falsa en la primera comprobación, el cuerpo nunca se ejecuta.

While y Do-While no tienen un límite propio, pero la ejecución está limitada por el tiempo máximo del flujo y por las 500 pasadas de planificación del ejecutor. Una pasada no equivale a una iteración; el total completado depende del grafo.

Bucle Do-While -- ejecuta el cuerpo al menos una vez y luego evalúa la condición después de cada iteración. Útil cuando necesitas al menos una pasada antes de comprobar.

Cómo funciona

El LoopBlockHandler del ejecutor gestiona el control de iteraciones:

  1. Inicializar -- el contador del bucle comienza en 1. En los bucles forEach, se resuelve la colección (JSON, referencias a variables o expresiones).
  2. Comprobar la continuación -- for/forEach comparan el contador con la longitud de la colección o el número de iteraciones. while/doWhile evalúan la expresión de condición usando el mismo motor que el bloque Condición.
  3. Activar los elementos secundarios -- los bloques conectados al controlador de inicio interno del bucle se colocan en la ruta de ejecución activa.
  4. Recopilar resultados -- las salidas de cada iteración de For y For Each se agregan en la salida results del contenedor.
  5. Incrementar y repetir -- el contador avanza y el paso 2 se ejecuta de nuevo. Cuando el bucle finaliza, se activan los bloques conectados al controlador de salida del bucle.

Variables de iteración

Dentro del cuerpo del bucle, están disponibles las siguientes variables:

VariableTipoDescripción
loop.indexnumberÍndice basado en cero de la iteración actual
loop.currentItemanyEl elemento actual (bucles ForEach) o el contexto del bucle (bucles While)
loop.itemsarray/objectLa colección completa que se itera (solo ForEach)

Cuando un bucle For o For Each finaliza, los bloques posteriores pueden acceder a results. Selecciona la salida del contenedor en el menú de referencias y sustituye loop-id por su ID real. While y Do While no incluyen results en su salida final.

VariableTipoDescripción
<loop-id.results>arraySalidas de los bloques hijos agrupadas por iteración, en orden

Configuración

ParámetroSe aplica aDescripción
Tipo de bucleTodosfor, forEach, while o doWhile
IteracionesForNúmero de veces que se repite (predeterminado: 5)
ColecciónForEachArray u objeto que se va a iterar. Admite literales JSON, referencias <block.output> y expresiones.
CondiciónWhile / Do-WhileExpresión booleana que se evalúa en cada iteración (p. ej., <variable.i> < 10)

Casos de uso de ejemplo

Procesamiento de resultados de la API

  1. Un bloque de API obtiene una lista de registros de clientes.
  2. Un bucle ForEach itera sobre cada cliente.
  3. Dentro del bucle, un Agent analiza los datos del cliente y una Function almacena el resultado.
  4. Después del bucle, un bloque Response devuelve los resultados agregados mediante <loop-id.results>.

Refinamiento iterativo

  1. Un bucle For configurado con 5 iteraciones genera variaciones de contenido.
  2. Dentro del bucle, un Agent produce un borrador y un Evaluator lo puntúa.
  3. Después del bucle, una Function selecciona la variación con la puntuación más alta de <loop-id.results>.

Limitaciones

Los bloques contenedores (bucles y paralelos) no se pueden anidar entre sí. No puedes colocar un Loop dentro de otro Loop, ni un Parallel dentro de un Loop. Si necesitas una iteración multidimensional, reestructura tu flujo de trabajo para usar bucles secuenciales o procesar los datos por etapas.

Los bucles ejecutan las iteraciones de forma secuencial. Para la ejecución concurrente de tareas independientes, usa el bloque Parallel en su lugar.

Buenas prácticas

  • Establece un número razonable de iteraciones para los bucles For a fin de evitar flujos de trabajo de larga duración. El valor predeterminado es 5.
  • Usa ForEach para las colecciones — se ajusta automáticamente a la longitud de la colección y te proporciona currentItem.
  • Actualiza siempre tu variable de condición dentro de los bucles While/Do-While. Olvidar cambiar la variable de la que depende la condición genera un bucle infinito (limitado por las pasadas del ejecutor y el tiempo máximo del flujo).