Kurso de Raku / Funkcia, samtempa, reaktiva kaj reta programado / Reaktiva programado / Vivaj kaj laŭpetaj supply
Vivaj supply en ago
Ĉar viva supply elsendas al kiuj ajn konektoj aŭskultas en la
momento, pluraj aŭskultantoj povas sekvi la saman fluon samtempe — kaj
ĉiu rajtas aliĝi aŭ foriri, kiam ĝi volas. Ĉi tie du aŭskultantoj
rigardas fluon da eventoj: log, kiu registras ĉion, kaj
alert, kiu aliĝas pli malfrue kaj foriras pli frue.
my $supplier = Supplier.new;
my $events = $supplier.Supply;
my $log = $events.tap(-> $v { say "log: $v" }); # la unua aŭskultanto aliĝas
$supplier.emit('start');
my $alert = $events.tap(-> $v { say "alert: $v" }); # dua aŭskultanto aliĝas
$supplier.emit('warning');
$supplier.emit('all clear');
$log.close; # la unua aŭskultanto foriras
$supplier.emit('stop');Ĉi tio presas:
log: start
log: warning
alert: warning
log: all clear
alert: all clear
alert: stopLa vivociklo de la du konektoj viciĝas jene — 🟢 markas konekton aliĝantan, 🔴 konekton forirantan, kaj ✅ ĉiun valoron, kiun konekto efektive ricevas:
| Paŝo | log |
alert |
|---|---|---|
$events.tap → log |
🟢 aliĝas | |
emit 'start' |
✅ start | |
$events.tap → alert |
🟢 aliĝas | |
emit 'warning' |
✅ warning | ✅ warning |
emit 'all clear' |
✅ all clear | ✅ all clear |
$log.close |
🔴 foriras | |
emit 'stop' |
✅ stop |
Malplena ĉelo signifas, ke tiu konekto ne aŭskultis, kiam la valoro eliris. Sekvu la tempolinion:
.tapredonas objektonTap— la tenilon, kiun vi konservas por regi tiun unu abonon.startestas eligita dum nurlogaŭskultas, do nurlogvidas ĝin. Jen denove la regulo de viva supply:alertaliĝis poststart, kaj viva supply ne represpektas la pasintecon, doalertneniam vidas ĝin.warningkajall clearestas eligitaj dum ambaŭ estas konektitaj, do ĉiu valoro atingas ambaŭ — en la ordo, laŭ kiu la konektoj abonis, unuelog, postealert.- Voki
$log.closeforlasas la supply. De tiamlogricevas nenion, do la finastopatingas nuralert.
Du aferojn indas kunporti. Unue, unu sola viva supply povas
disvastiĝi al multaj sendependaj konektoj samtempe. Due, ĉiu konekto
estas propra abono kun propra vivodaŭro: tenu la objekton
Tap, kiun .tap redonas, kaj vi povas fini tiun
unu aŭskultanton per .close sen ĝeni la aliajn.
Kursa navigado
← Vivaj supply | Du konektiĝoj →
💪 Aŭ iru rekte al la ekzercoj de ĉi tiu
sekcio.