Zum Inhalt springen

Ports und Verbindungen

Die Ports zu verstehen bedeutet zu verstehen, wann ein Baustein ausgeführt wird. Diese Seite ist die Referenz für das Modell.

Jeder Baustein besitzt sie, ohne dass sie in seiner Konfiguration erscheinen:

PortRichtungFlussRolle
inEingangSignalAuslöser. Mehrere eingehende Verbindungen werden akzeptiert
errorAusgangWert + SignalFehlerpfad
doneAusgangSignalWird ausgelöst, nachdem der Baustein und sein gesamter nachgelagerter Teilgraph abgeschlossen sind

Drei Bausteine besitzen keinen error-Port: Ausgang, Jetzt und Retry (Letzterer bildet selbst eine Fehlergrenze). Zwei besitzen kein done: Ausgang und Throw.

FlussGedankenmodellVerhalten
WertEine DateneinheitTransportiert einen Wert; dient auch als Auslöser
SignalEin ImpulsTransportiert nichts, löst nur aus
BeidesTransportiert einen Wert und löst aus

Die einzige verbotene Kombination: ein Ausgang mit reinem Signal zu einem Eingang mit reinem Wert. Es gäbe nichts, das in den Wert eingesetzt werden könnte.

any · json · number · string · boolean · duration · response · status · list · object.

Die Typisierung dient vor allem dem visuellen Komfort, mit einer strikten Ausnahme: Ein Eingang vom Typ Liste (der Port list der Aktionen Zu Liste hinzufügen und Aus Liste entfernen) verweigert eine Quelle, die nicht listenkompatibel ist. json und list sind untereinander kompatibel; ein einfaches object ist es nicht.

  • Ein Eingangsport akzeptiert nur eine einzige Verbindung. Das macht den Graphen lesbar: ein Wert, eine Herkunft.
  • Außer in, der so viele Verbindungen akzeptiert wie gewünscht.
  • Ein Ausgang kann beliebig viele Eingänge speisen.

Drei Regeln, in dieser Reihenfolge:

  1. Die Wurzeln starten. Jeder Baustein ohne eingehende Verbindung wird beim Start des Szenarios angestoßen. Es gibt keinen „Start“-Baustein.
  2. Nur verdrahtete Eingänge werden abgewartet. Ein Baustein wird ausgeführt, sobald jeder seiner tatsächlich verbundenen Eingangsports einen Wert erhalten hat. Ein nicht verdrahteter Port wird nie abgewartet. Die Werte bleiben gespeichert: Ein Eingang behält den zuletzt empfangenen Wert.
  3. Der in-Port bildet eine Schranke. Wird er von mehreren Verbindungen gespeist, wartet er, bis alle eingetroffen sind, und löst dann einmal aus. Das ist das „warte, bis diese drei Zweige fertig sind“ des Modells.

Die Ausnahme: bei jedem Ereignis erneut auslösen

Section titled “Die Ausnahme: bei jedem Ereignis erneut auslösen”

Die Option „Bei jedem empfangenen Ereignis erneut auslösen“ (Kontextmenü des Bausteins) verwandelt alle verdrahteten Eingänge in nicht blockierende „Oder“-Tore: Der Baustein wird bei jedem empfangenen Wert erneut ausgelöst, an welchem Port auch immer.

Zwei Anwendungsfälle: einen Stream Nachricht für Nachricht verarbeiten und einen Abschlusszyklus entblockieren (ein Graph, der auf sich selbst zurückschleift).

Das ist die in der Praxis nützlichste Unterscheidung:

  • ein Wertausgang sendet, sobald der Baustein sein Ergebnis erzeugt hat;
  • done wartet zusätzlich, bis alles, was dieses Ergebnis konsumiert, fertig ist.

Um zu sequenzieren – „mach das alles, dann räum auf“ – verdrahten Sie von done aus. Um Daten weiterzugeben, verdrahten Sie vom Wertausgang aus.

Sie sind kein eigener Mechanismus: Es sind Ausgangsports mit einer Rolle, die ihre Farbe bestimmt.

BausteinAusgänge
Ifthen / else
While, Do…Whilethen (der Rumpf)
Assertthen (Erfolg) / else (Fehlschlag)
Retryattempt / exhausted
Schemavalidierungvalid / invalid / errors
Switchein Port pro Fall, plus default
Socket.IO-Verbindungein Port pro deklariertem Ereignis, plus others

Eine Verbindung kann einen Selektor tragen: einen Pfad, der auf den durchlaufenden Wert angewendet wird.

data.items[0].id
body['user-id']
headers["content-type"]
status

Die Formen a.b, a[0], a['clé'] und a["clé"] werden akzeptiert. Ein Segment, das JSON enthält, wird im Flug analysiert; ein Pfad, der auf nichts passt, ergibt undefined.

Restorm leitet einen Selektor manchmal von selbst ab, während der Verdrahtung, wenn die Quelle eine statische Vorschau besitzt, die sich auf einen einzigen primitiven Wert reduziert. Sie können ihn jederzeit ersetzen oder leeren.