Курс языка программирования Raku / Функциональное, конкурентное, реактивное и веб-программирование / Реактивное программирование / react и whenever

whenever

Один блок react может содержать несколько блоков whenever, каждый из которых следит за своим supply. Блок реагирует на тот supply, который выдал значение следующим, и выполняет соответствующее тело:

my $sum = 0;

react {
    whenever Supply.from-list(1, 2, 3) {
        $sum += $_;
    }
    whenever Supply.from-list(10, 20) {
        $sum += $_;
    }
}

say $sum; # 36

За обоими supply следят одновременно. Их значения — 1, 2, 3 и 10, 20 — стекаются в $sum, которая в итоге равна 36. Блок react завершается, только когда закончатся оба supply.

Каждый whenever реагирует независимо, и именно так объединяют потоки: по одному whenever на источник, все внутри одного react. Настоящая программа могла бы следить за сетевым соединением в одном whenever и за таймером в другом, отвечая на события каждого по мере их поступления.

В теле whenever вам доступно выданное значение (как $_ или именованный параметр), и с ним можно делать что угодно: обновлять состояние, выдавать значения в другой supply или даже досрочно закрыть блок react вызовом done.

Практика

Пройдите 2 теста по содержанию этой темы.

Навигация по курсу

Тест — react   |   Тест — whenever


💪 Или перейдите сразу к упражнениям этого раздела.