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

whenever и when

Форма блока react может показаться знакомой. Внешний блок, содержащий несколько внутренних, каждый из которых работает с текущим значением $_, — ровно так пишется given/when. Если бы у вас было одно показание температуры, а не целый их поток, вы бы разветвлялись по нему так:

given $temperature {
    when 18 { say 'cool' }
    when 21 { say 'warm' }
}

Сходство с react/whenever не случайно, но задачи у них совершенно разные:

  • given/when обрабатывает одно значение прямо сейчас. given устанавливает $_ в одно значение; каждый when проверяет его ($_ ~~ 18), выполняется первое совпадение, и на этом блок закончен. Это обычное синхронное условное ветвление.
  • react/whenever обрабатывает множество значений во времени. whenever не сверяет $_ с образцом — он подписывается на supply, и его тело выполняется для каждого значения, которое этот supply выдаст, когда бы оно ни пришло. Все whenever действуют одновременно, а react продолжает блокировать выполнение, пока не закончится каждый из их supply.

Итак, when спрашивает: «совпадает ли это одно значение?», а whenever говорит: «для каждого значения, которое когда-либо выдаст этот поток, делай вот это». Скелет один и тот же, а жизнь совсем разная: единожды выбранная ветка — и реакция, срабатывающая снова и снова по мере поступления событий.

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

Supply, объявленные снаружи   |   Два таймера


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