Dogodki med orbitali

Poveži dva orbitala z zunanjim dogodkom in kvalificiranim poslušanjem, ne da bi kateri segel v drugega.

Orbitali se nikoli ne kličejo med seboj in si ne delijo avtomatov stanj. Eden odda dogodek, drugi ga posluša. Ta vodnik poveže naročilo z oglasno desko obvestil.

1. Oddaj zunanji dogodek

Dogodek, ki zapusti svoj orbital, je external in mora navesti svoj tovor:

lolo
1emits { 2 ORDER_SHIPPED -> external { 3 orderId : string! 4 } 5}
lolo
1 2 3 SHIP -> shipped (set @entity.status shipped) (emit ORDER_SHIPPED { orderId: "A-1042" })

2. Poslušanje med orbitali

Znotraj svojega orbitala lastnost piše Trait.EVENT. Med orbitali se vir kvalificira z imenom orbitala:

lolo
1listens { 2 OrderOrbital.OrderLifecycle.ORDER_SHIPPED -> SHOW 3 SHOW { 4 orderId : string! 5 } 6}

Dvodelni vir, ki imenuje lastnost, ki obstaja le v drugem orbitalu, je napaka, sporočilo pa pove, katero kvalificirano obliko uporabiti.

3. Oba orbitala

Zgornji program kot avtomati stanj, eden za vsako lastnost: vsak okvir je stanje, vsaka puščica dogodek, ki ga premakne, ikone na puščici pa so učinki, ki jih ta dogodek izvede. ◇ na puščici je varovalo; z miško pojdite nanj in preberite pogoj. Kako brati AVL

OrderLifecycle

on Order · states: 2 · transitions: 2
emitsORDER_SHIPPED
SHIP
RESET
pending
shipped

NoticeBoard

on Notice · states: 1 · transitions: 1
listensORDER_SHIPPED
SHOW
idle

Kako se lastnosti pogovarjajo med seboj, po vrsti:

NotificationOrbital.NoticeBoardOrderOrbital.OrderLifecycleNotificationOrbital.NoticeBoardOrderOrbital.OrderLifecycleUporabnikSHIPset @entity.status shippedORDER_SHIPPED → SHOWset @entity.messagerender-ui mainUporabnik
std-orb-docex-relay.lolololo
1app std-orb-docex-relay "1.0.0" 2"std-orb-docex-relay — two orbitals: one emits an external event, the other listens with the qualified three-part source." 3orbital OrderOrbital { 4 entity Order [runtime] { 5 id : string! 6 status : "pending" | "shipped" = pending 7 } 8 9 trait OrderLifecycle -> Order [interaction, instance] { 10 initial: pending 11 12 state pending { 13 INIT -> pending 14 (render-ui main { type: stack, direction: horizontal, gap: md, align: center, children: [ 15 { type: badge, label: "Pending", variant: warning }, 16 { type: button, label: "Ship order", action: SHIP, variant: primary } 17 ] }) 18 SHIP -> shipped 19 (set @entity.status shipped) 20 (emit ORDER_SHIPPED { orderId: "A-1042" }) 21 (render-ui main { type: stack, direction: horizontal, gap: md, align: center, children: [ 22 { type: badge, label: "Shipped", variant: success }, 23 { type: button, label: "New order", action: RESET, variant: ghost }, 24 { type: button, label: "See notifications", href: "/notices", variant: link } 25 ] }) 26 } 27 28 state shipped { 29 RESET -> pending 30 (set @entity.status pending) 31 (render-ui main { type: stack, direction: horizontal, gap: md, align: center, children: [ 32 { type: badge, label: "Pending", variant: warning }, 33 { type: button, label: "Ship order", action: SHIP, variant: primary } 34 ] }) 35 } 36 37 emits { 38 ORDER_SHIPPED -> external { 39 orderId : string! 40 } 41 @description "An order left the warehouse." 42 } 43 } 44 45 page "/orders" -> OrderLifecycle 46} 47 48orbital NotificationOrbital { 49 entity Notice [runtime] { 50 id : string! 51 message : string = "" 52 } 53 54 trait NoticeBoard -> Notice [interaction, instance] { 55 initial: idle 56 57 state idle { 58 INIT -> idle 59 (render-ui main { type: stack, direction: vertical, gap: sm, children: [ 60 { type: typography, content: "No notifications yet.", variant: body, color: muted }, 61 { type: button, label: "Back to orders", href: "/orders", variant: link } 62 ] }) 63 SHOW -> idle 64 (set @entity.message (str/concat "Order " ?orderId " shipped")) 65 (render-ui main { type: alert, variant: info, message: @entity.message }) 66 } 67 68 listens { 69 OrderOrbital.OrderLifecycle.ORDER_SHIPPED -> SHOW 70 SHOW { 71 orderId : string! 72 } 73 } 74 } 75 76 page "/notices" -> NoticeBoard 77}

Preverjevalnik povezavo preveri od konca do konca: dogodek je naveden, njegov tovor se ujema s tem, kar bere poslušalec, zunanji dogodek brez poslušalca kjerkoli pa je sporočen.

Povezovanje prek nastavitev

Vedenje, ki mu je treba povedati, kateri dogodek naj sproži, vzame gumb tipa event, naslovljen z istimi oblikami kot listens: EVENT, Trait.EVENT ali Orbital.Trait.EVENT. Naslov mora imenovati lastnost v programu in enega od njenih navedenih vhodov.

© 2026 Almadar. Ljubljana, Slovenija.
Not reported here