Loop

logic_loop · logic · Logica & Flow · Disponibile · v2.0.0

Descrizione

Operatore di iterazione enterprise — il workhorse di tutte le pipeline batch del workflow business. Itera una collezione (array di oggetti, object con key=>value, string split per character/word/line) attraverso il ramo "body" del workflow editor, applicando per ogni item la stessa sequenza di azioni configurate downstream. Equivalente concettuale del `for-each` dei linguaggi di programmazione classici ma con cinque strategie di esecuzione configurabili per coprire spettro completo dei use case da 10 item a 10M item: (1) naive — 1-at-a-time sequenziale, semplice e prevedibile, default per dataset < 100 item dove la latency totale del workflow non è blocker e ogni step può essere debugged singolarmente; (2) batch — chunk di N item alla volta (es. 50 per batch), pattern bilanciato per dataset 1k-10k item dove il throughput è importante ma vogliamo ancora controllo granular dei chunks per error handling; (3) bulk — UNA singola call downstream con l'array intero come input, pattern critico quando il nodo downstream supporta operazioni bulk (es. action_email_send_tracked_batch, db_insert bulk) — riduce overhead di N invocazioni separate; (4) queue — processing asincrono via BullMQ (Redis/Dragonfly) per dataset > 10k item, attivo SE il worker BullMQ è in esecuzione (processo `flowforge worker`); se nessun worker è attaccato, il loop ricade automaticamente su naive (con log esplicito) — nessun dato perso, solo throughput ridotto; (5) aggregate — modalità riduzione senza body (no iteration steps), equivalente a passare l'array a logic_aggregate downstream senza per-item processing; (6) auto — l'engine FlowForge sceglie automaticamente la strategy migliore basata su array size + downstream node capabilities introspection. Scope expression per ogni iteration espone variabili context al body: {{loop.item}} (l'item corrente dell'iterazione), {{loop.index}} (0-based position), {{loop.total}} (size della collezione), {{loop.first}} (boolean true per il primo item, utile per email header decoration "Ciao {{name}}!" solo la prima volta), {{loop.last}} (boolean true per l'ultimo, per email footer "fine elenco"), {{loop.percentage}} (per progress reporting). Branch outputs del nodo per error handling: "done" (success aggregato — tutti gli iter completati senza error), "error" (almeno 1 iteration ha fallito — il caller può vedere quali in failedItems). Cap configurable maxIterations (default 10000) per safety anti-runaway. Use case: process batch ordini Stripe webhook ricevuti via paginate → loop con strategy=batch per gestire 500 ordini in batch 50; parse righe CSV/Excel uploaded → loop su rows dell'output xlsx_parse con strategy=naive per debug step-by-step; enrich N lead CRM con dati esterni via action_company_search + action_lead_score (strategy=batch 10 per gestire rate-limit upstream); multi-recipient email con personalization per ogni destinatario; bulk insert in DB di analytics events con strategy=bulk per one-shot db_insert atomic.

⚙️ Parametri di configurazione

Campi mostrati nell’editor quando si configura il nodo. Generati direttamente dal NodeDefconfigFields.

CampoTipoRequiredDefaultDescrizione
itemsExpression
Espressione array da iterare
expressionsi
input.records
Espressione JS che ritorna un array. Esempi: input.orders · input.rows · [1,2,3,4,5] · Object.values(input) · input.text.split("\n")
strategy
Strategia di iterazione
enum
naivebatchbulkqueueaggregateauto
sinaivenaive = uno alla volta (semplice). batch = in chunk (più veloce). bulk = singola chiamata bulk (se l'API supporta). queue = asincrono via BullMQ. aggregate = solo riduzione (no body). auto = engine sceglie il meglio.
batchSize
Dimensione chunk
numberno100Item per chunk. Solo per strategia "batch". Es. 100 = processa 100 alla volta.
concurrency
Concorrenza (iterazioni in parallelo)
numberno11 = seriale (un'iterazione alla volta). N = fino a N iterazioni in parallelo. 0 = illimitato (sconsigliato). Cap massimo = 50.
errorPolicy
Politica di gestione errori
enum
stopcontinuedlq
nocontinuestop = ferma il loop al primo errore. continue = registra l'errore e prosegue. dlq = push in dead-letter queue per retry differito.
rateLimitPerMin
Rate limit (richieste/minuto)
numberno0Throttle a N iterazioni al minuto. 0 = nessun limite. Usa quando l'API a valle ha rate limit noto (es. 60 per Stripe gratis).
maxItems
Limite massimo iterazioni (safety)
numberno100000Hard cap anti-runaway. Se l'array supera questa soglia, l'engine solleva errore. 100k default è sicuro per la maggioranza dei casi.
aggregateBy
Campo group-by (aggregate)
stringno
es. customer_id, category, region
Nome del campo dell'item su cui raggruppare prima di ridurre. Es. items=[{customer_id:1,amount:10},{customer_id:1,amount:20}] con aggregateBy=customer_id raggruppa i 2 elementi.
aggregateReducer
Funzione di riduzione
enum
countsumavgminmaxconcatcollect
nocountcount = conta elementi del gruppo. sum/avg/min/max = applica al campo "aggregateField" sotto. concat = join stringhe. collect = ritorna array di item.
aggregateField
Campo per sum/avg/min/max
stringno
es. amount, quantity, price
Nome del campo numerico da sommare/mediare. Ignorato per count/concat/collect. Es. con sum e aggregateField=amount, il risultato è la somma di tutti gli amount del gruppo.

⬆️ Output del nodo

Campi disponibili nei nodi successivi via $node.<alias>.json.<field>:

  • body
  • done

💡 Esempio configurazione

Snippet JSON del nodo come compare nel workflow. I valori sono derivati daidefaultValue e dai parametri required.

{
  "id": "node-logic_loop-1",
  "defId": "logic_loop",
  "label": "Loop",
  "config": {
    "itemsExpression": "input.records",
    "strategy": "naive",
    "batchSize": 100,
    "concurrency": 1,
    "errorPolicy": "continue",
    "rateLimitPerMin": 0,
    "maxItems": 100000,
    "aggregateReducer": "count"
  }
}

🔗 Nodi correlati nella stessa categoria

Pronto a usare Loop?

Disponibile da subito in tutti i piani FlowForge. Provalo gratis senza carta di credito.

Inizia gratisSfoglia tutti i nodi