Курс языка программирования 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 останавливает
сразу все реакции.