Raku-Kurs / Funktionale, nebenläufige, reaktive und Web-Programmierung / Reaktive Programmierung / Live- und On-Demand-Supplies
Live-Supplies in Aktion
Da ein Live-Supply an die gerade zuhörenden Zapfstellen sendet,
können mehrere Zuhörer demselben Strom zugleich folgen — und jeder darf
beliebig ein- oder aussteigen. Hier beobachten zwei Zuhörer einen Strom
von Ereignissen: ein log, das alles festhält, und ein
alert, das später einsteigt und früher geht.
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');Das gibt aus:
log: start
log: warning
alert: warning
log: all clear
alert: all clear
alert: stopDer Lebenslauf der beiden Zapfstellen sieht so aus — 🟢 kennzeichnet einen Einstieg, 🔴 einen Ausstieg und ✅ jeden Wert, den eine Zapfstelle tatsächlich erhält:
| Schritt | log |
alert |
|---|---|---|
$events.tap → log |
🟢 steigt ein | |
emit 'start' |
✅ start | |
$events.tap → alert |
🟢 steigt ein | |
emit 'warning' |
✅ warning | ✅ warning |
emit 'all clear' |
✅ all clear | ✅ all clear |
$log.close |
🔴 geht | |
emit 'stop' |
✅ stop |
Eine leere Zelle bedeutet, dass diese Zapfstelle nicht zuhörte, als der Wert hinausging. Folgen Sie dem Zeitverlauf:
.tapliefert einTap-Objekt — den Griff, den Sie behalten, um genau dieses Abonnement zu steuern.startwird ausgesandt, während nurlogzuhört, nurlogsieht es also. Das ist wieder die Regel des Live-Supply:alertstieg nachstartein, und ein Live-Supply spielt die Vergangenheit nicht erneut ab,alertsieht es also nie.warningundall clearwerden ausgesandt, während beide angezapft haben, jeder Wert erreicht also beide — in der Reihenfolge, in der die Zapfstellen abonniert haben, erstlog, dannalert.$log.closeaufzurufen verlässt das Supply. Von da an erhältlognichts mehr, das abschließendestoperreicht also nuralert.
Zweierlei bleibt festzuhalten. Erstens kann ein einzelnes Live-Supply
zugleich an viele unabhängige Zapfstellen ausfächern. Zweitens ist jede
Zapfstelle ein eigenes Abonnement mit eigener Lebensdauer: Halten Sie
das Tap-Objekt fest, das .tap liefert, und Sie
können diesen einen Zuhörer mit .close beenden, ohne die
anderen zu stören.
Kursnavigation
← Live-Supplies | Zwei Taps →
💪 Oder springen Sie direkt zu den Übungen dieses
Abschnitts.