Курс 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: решту першого потоку (3) і весь другий потік (10, 20) відтято ще до доставляння. Тож @out містить самі [1 2]. Якби done глушив лише власний струмінь, ви побачили б [1 2 10 20] — але один done спиняє всі реакції одразу.

Навігація курсом

Тест — whenever   |   Supply, оголошені ззовні