Porte e collegamenti
Capire le porte significa capire quando un riquadro si esegue. Questa pagina è il riferimento del modello.
Le tre porte implicite
Section titled “Le tre porte implicite”Ogni riquadro le possiede, senza che compaiano nella sua configurazione:
| Porta | Verso | Flusso | Ruolo |
|---|---|---|---|
in | Input | Segnale | Grilletto. Sono accettati più collegamenti in ingresso |
error | Output | Valore + segnale | Via di fallimento |
done | Output | Segnale | Emesso dopo il completamento del riquadro e di tutto il suo sottografo a valle |
Tre riquadri non hanno porta error: Uscita, Adesso e
Retry (quest’ultimo è esso stesso una frontiera di errore). Due
non hanno done: Uscita e Throw.
Tipi di flusso
Section titled “Tipi di flusso”| Flusso | Simbolo mentale | Comportamento |
|---|---|---|
| Valore | Un dato | Trasporta un valore; serve anche da grilletto |
| Segnale | Un impulso | Non trasporta nulla, si limita a innescare |
| Entrambi | Trasporta un valore e innesca |
La sola combinazione vietata: un’uscita di puro segnale verso un input di puro valore. Non ci sarebbe nulla da mettere nel valore.
Tipi di dato
Section titled “Tipi di dato”any · json · number · string · boolean · duration · response ·
status · list · object.
La tipizzazione serve soprattutto al comfort visivo, con un’eccezione stretta: un
input di tipo lista (la porta list delle azioni Aggiungi a un elenco e
Rimuovi da un elenco) rifiuta una sorgente che non sia compatibile con una
lista. json e list sono compatibili tra loro; un semplice object non lo è.
Arietà
Section titled “Arietà”- Una porta di input accetta un solo collegamento. È ciò che rende il grafo leggibile: un valore, una provenienza.
- Tranne
in, che accetta quanti collegamenti si vogliono. - Un’uscita può alimentare quanti input si vogliono.
Quando un riquadro si esegue
Section titled “Quando un riquadro si esegue”Tre regole, in quest’ordine:
- Le radici partono. Ogni riquadro senza collegamenti in ingresso viene innescato al lancio dello scenario. Non esiste un riquadro «partenza».
- Vengono attesi soltanto gli input cablati. Un riquadro si esegue quando ciascuna delle sue porte di input effettivamente collegate ha ricevuto un valore. Una porta non cablata non viene mai attesa. I valori restano memorizzati: un input conserva l’ultimo valore ricevuto.
- La porta
infa da barriera. Alimentata da più collegamenti, attende che tutti siano arrivati, poi innesca una volta. È il «attendere che questi tre rami siano finiti» del modello.
L’eccezione: rieseguire a ogni evento
Section titled “L’eccezione: rieseguire a ogni evento”L’opzione «Riesegui a ogni evento ricevuto» (menu contestuale del riquadro) trasforma tutti gli input cablati in porte «or» non bloccanti: il riquadro si riattiva a ogni valore ricevuto, su qualunque porta.
Due usi: elaborare un flusso messaggio per messaggio e sbloccare un ciclo di completamento (un grafo che si richiude su se stesso).
done contro un’uscita di valore
Section titled “done contro un’uscita di valore”È la distinzione più utile in pratica:
- un’uscita di valore emette appena il riquadro ha prodotto il suo risultato;
doneattende inoltre che tutto ciò che consuma quel risultato abbia finito.
Per mettere in sequenza — «fai tutto questo, poi ripulisci» — si cabla da done.
Per passare un dato, si cabla dall’uscita di valore.
I rami condizionali
Section titled “I rami condizionali”Non sono un meccanismo a parte: sono porte di output portatrici di un ruolo, che ne governa il colore.
| Riquadro | Uscite |
|---|---|
| If | then / else |
| While, Do…While | then (il corpo) |
| Assert | then (successo) / else (fallimento) |
| Retry | attempt / exhausted |
| Validazione dello schema | valid / invalid / errors |
| Switch | una porta per caso, più default |
| Connessione Socket.IO | una porta per evento dichiarato, più others |
Selettori di collegamento
Section titled “Selettori di collegamento”Un collegamento può portare un selettore: un percorso applicato al valore in transito.
data.items[0].idbody['user-id']headers["content-type"]statusSono accettate le forme a.b, a[0], a['clé'] e a["clé"]. Un segmento
che contiene JSON viene analizzato al volo; un percorso che non corrisponde a nulla
dà undefined.
Restorm a volte deduce un selettore da solo al momento del cablaggio, quando la sorgente ha un’anteprima statica che si riduce a un unico valore primitivo. È sempre possibile sostituirlo o svuotarlo.