Курс по 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 спира всички
реакции наведнъж.