Curso de Raku / Programación funcional, concurrente, reactiva y web / Programación reactiva / Supplies en vivo y bajo demanda
Supplies en vivo en acción
Como un supply en vivo difunde a los enganches que estén escuchando
en el momento, varios oyentes pueden seguir el mismo flujo a la vez, y
cada uno es libre de unirse o marcharse cuando quiera. Aquí dos oyentes
observan un flujo de eventos: un log que lo registra todo y
una alert que se une más tarde y se marcha antes.
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');Esto imprime:
log: start
log: warning
alert: warning
log: all clear
alert: all clear
alert: stopEl ciclo de vida de los dos enganches encaja así — 🟢 marca un enganche que se une, 🔴 uno que se marcha y ✅ cada valor que un enganche recibe realmente:
| Paso | log |
alert |
|---|---|---|
$events.tap → log |
🟢 se une | |
emit 'start' |
✅ start | |
$events.tap → alert |
🟢 se une | |
emit 'warning' |
✅ warning | ✅ warning |
emit 'all clear' |
✅ all clear | ✅ all clear |
$log.close |
🔴 se marcha | |
emit 'stop' |
✅ stop |
Una celda en blanco significa que ese enganche no estaba escuchando cuando salió el valor. Sigue la línea temporal:
.tapdevuelve un objetoTap: el asa que conservas para controlar esa suscripción concreta.startse emite cuando solologestá escuchando, así que solologlo ve. Es de nuevo la regla del supply en vivo:alertse unió después destart, y un supply en vivo no reproduce el pasado, así quealertnunca lo ve.warningyall clearse emiten cuando ambos están enganchados, así que cada valor llega a los dos, en el orden en que se suscribieron los enganches: primerolog, despuésalert.- Llamar a
$log.closeabandona el supply. A partir de ahílogno recibe nada, así que elstopfinal llega solo aalert.
Dos cosas para llevarse. Primera: un solo supply en vivo puede
abrirse en abanico hacia muchos enganches independientes a la vez.
Segunda: cada enganche es su propia suscripción, con su propio tiempo de
vida; conserva el objeto Tap que devuelve .tap
y podrás terminar ese oyente concreto con .close sin
molestar a los demás.
Navegación del curso
← Supplies en vivo | Dos conexiones →
💪 O ve directamente a los ejercicios de esta
sección.