Курс по 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, дефинирани отвън