Курс по Raku / Функционално, паралелно, реактивно и уеб програмиране / Реактивно програмиране / react и whenever
Два таймера
Всеки пример с react досега използваше Supply.from-list,
който тласка всичките си стойности в мига, в който се включат към него.
Затова всяка струя се отпечатваше изцяло, преди да започне следващата —
никакво чакане не участваше. Истинските струи от събития не са такива:
стойностите им пристигат разтеглени във времето, а
блокът react ги преплита в реда на пристигането им.
Таймерът е най-простата струя, която се държи така.
Supply.interval($period) подава нарастващ брояч —
0, 1, 2, … — веднъж на всеки $period секунди.
Пуснете два такива с различна честота вътре в един react и
стойностите им се сплитат:
react {
whenever Supply.interval(0.3) {
say "tick $_";
}
whenever Supply.interval(0.5, 0.25) {
say "TOCK $_";
}
whenever Promise.in(1.4) {
done;
}
}Типично изпълнение отпечатва:
tick 0
TOCK 0
tick 1
tick 2
TOCK 1
tick 3
tick 4
TOCK 2Бързият tick се задейства на всеки 0.3
секунди; по-бавният TOCK — на всеки 0.5,
започвайки след четвърт секунда (вторият аргумент на
interval е точно това начално закъснение). Нито един не
чака другия — блокът react просто изпълнява онова тяло на
whenever, което отговаря на пристигналата стойност, така че
двете струи се пресичат, вместо да се редуват.
Понеже таймерите никога не свършват сами, изходът осигурява трети
whenever: Promise.in(1.4) се изпълнява след
1,4 секунди, а тялото ѝ извиква done, за да прекрати блока
react. Без него react щеше да цъка и така да си цъка
вечно.
Точното преплитане зависи от таймингите, така че по-късно изпълнение може да подреди редовете малко по-различно — но такава е природата на откликването на живи събития: откликвате на всяко в момента на случването му, когато и да се случи.
Навигация в курса
← whenever и when | Главни букви с react →
💪 Или преминете направо към упражненията в този
раздел.