Курс Raku / Функційне, конкурентне, реактивне та веб-програмування / Реактивне програмування / Живі supply та supply на вимогу
Живі supply у дії
Оскільки живий потік транслює тим підключенням, що слухають у цю
мить, кілька слухачів можуть стежити за тим самим струменем водночас — і
кожен вільний приєднатися чи піти коли завгодно. Тут два слухачі
спостерігають за потоком подій: log, що записує все, та
alert, що приєднується пізніше й іде раніше.
my $supplier = Supplier.new;
my $events = $supplier.Supply;
my $log = $events.tap(-> $v { say "log: $v" }); # приєднується перший слухач
$supplier.emit('start');
my $alert = $events.tap(-> $v { say "alert: $v" }); # приєднується другий слухач
$supplier.emit('warning');
$supplier.emit('all clear');
$log.close; # перший слухач іде
$supplier.emit('stop');Це друкує:
log: start
log: warning
alert: warning
log: all clear
alert: all clear
alert: stopЖиттєвий цикл двох підключень вишиковується так: 🟢 позначає приєднання підключення, 🔴 — його вихід, а ✅ — кожне значення, яке підключення справді отримало:
| Крок | log |
alert |
|---|---|---|
$events.tap → log |
🟢 приєднується | |
emit 'start' |
✅ start | |
$events.tap → alert |
🟢 приєднується | |
emit 'warning' |
✅ warning | ✅ warning |
emit 'all clear' |
✅ all clear | ✅ all clear |
$log.close |
🔴 іде | |
emit 'stop' |
✅ stop |
Порожня комірка означає, що це підключення не слухало, коли значення виходило. Простежте часову лінію:
.tapповертає об’єктTap— держак, який ви тримаєте, щоб керувати саме цією підпискою.startвидано тоді, коли слухає лишеlog, тож лишеlogйого й бачить. Це знову те саме правило живого потоку:alertприєднався післяstart, а живий потік не програє минулого наново, тожalertніколи його не побачить.warningтаall clearвидано тоді, коли підключені обидва, тож кожне значення доходить до обох — у порядку, у якому підключення підписалися: спершуlog, потімalert.- Виклик
$log.closeвиводить з потоку. Відтодіlogне отримує нічого, тож останнєstopдоходить лише доalert.
Два висновки. По-перше, один живий потік може віялом розходитися на
багато незалежних підключень водночас. По-друге, кожне підключення є
власною підпискою з власним часом життя: тримайтеся за об’єкт
Tap, який повертає .tap, — і ви зможете
завершити саме цього слухача через .close, не турбуючи
інших.
Навігація курсом
← Живі supply | Два підключення →
💪 Або перейдіть одразу до вправ цього
розділу.