Cursus Raku / Functioneel, concurrent, reactief en webprogrammeren / Reactief programmeren / Live- en on-demand-supplies
Live-supplies in actie
Omdat een live supply uitzendt naar welke taps op dat moment ook
luisteren, kunnen meerdere luisteraars dezelfde stroom tegelijk volgen —
en elk mag naar believen in- of uitstappen. Hier bekijken twee
luisteraars een stroom gebeurtenissen: een log die alles
vastlegt, en een alert die later instapt en eerder
vertrekt.
my $supplier = Supplier.new;
my $events = $supplier.Supply;
my $log = $events.tap(-> $v { say "log: $v" }); # first listener joins
$supplier.emit('start');
my $alert = $events.tap(-> $v { say "alert: $v" }); # a second listener joins
$supplier.emit('warning');
$supplier.emit('all clear');
$log.close; # the first listener leaves
$supplier.emit('stop');Dit drukt af:
log: start
log: warning
alert: warning
log: all clear
alert: all clear
alert: stopDe levensloop van de twee taps ziet er zo uit — 🟢 markeert een tap die instapt, 🔴 een tap die vertrekt, en ✅ elke waarde die een tap werkelijk ontvangt:
| Stap | log |
alert |
|---|---|---|
$events.tap → log |
🟢 stapt in | |
emit 'start' |
✅ start | |
$events.tap → alert |
🟢 stapt in | |
emit 'warning' |
✅ warning | ✅ warning |
emit 'all clear' |
✅ all clear | ✅ all clear |
$log.close |
🔴 vertrekt | |
emit 'stop' |
✅ stop |
Een lege cel betekent dat die tap niet luisterde toen de waarde uitging. Volg de tijdlijn:
.tapgeeft eenTap-object terug — de handgreep die je bewaart om dat ene abonnement te sturen.startwordt uitgezonden terwijl alleenlogluistert, dus alleenlogziet het. Dat is opnieuw de regel van de live supply:alertstapte nastartin, en een live supply speelt het verleden niet opnieuw af, dusalertziet het nooit.warningenall clearworden uitgezonden terwijl beide aftappen, dus bereikt elke waarde beide — in de volgorde waarin de taps zich abonneerden, eerstlog, danalert.$log.closeaanroepen verlaat de supply. Vanaf dan ontvangtlogniets meer, dus bereikt de afsluitendestopalleenalert.
Twee dingen om te onthouden. Ten eerste kan één enkele live supply
tegelijk naar veel onafhankelijke taps uitwaaieren. Ten tweede is elke
tap een eigen abonnement met een eigen levensduur: houd het
Tap-object vast dat .tap teruggeeft, en je
kunt die ene luisteraar met .close beëindigen zonder de
andere te storen.
Cursusnavigatie
← Live-supplies | Twee taps →
💪 Of ga direct naar de oefeningen in deze
sectie.