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

Тест — whenever и done

Что выведет следующая программа?

my @out;

react {
    whenever Supply.from-list(1, 2, 3) {
        @out.push($_);
        done if $_ == 2;
    }
    whenever Supply.from-list(10, 20) {
        @out.push($_);
    }
}

say @out;
1[1 2]
0[1 2 10 20]
0[1 2 3 10 20]
0[10 20]

Первый whenever добавляет 1, затем 2 — и на 2 вызывает done. Принципиально важно, что done завершает весь блок react, а не только свой whenever: остаток первого supply (3) и весь второй supply (10, 20) отсекаются, так и не будучи доставленными. Поэтому в @out остаётся лишь [1 2]. Если бы done заглушал только собственный поток, вы увидели бы [1 2 10 20], — но один done останавливает сразу все реакции.

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

Тест — whenever   |   Supply, объявленные снаружи