Curso de Raku / Programación funcional, concurrente, reactiva y web / Programación reactiva / react y whenever / whenever
Quiz — whenever y done
¿Qué imprime el programa siguiente?
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] |
El primer whenever añade 1, después
2, y con el 2 llama a done. El
punto crucial es que done termina el bloque
react entero, no solo su propio
whenever: el resto del primer supply (3) y el
segundo supply completo (10, 20) quedan cortados
antes de entregarse. Así que @out contiene solo
[1 2]. Si done silenciara únicamente su propio
flujo, habrías visto [1 2 10 20], pero un solo
done detiene todas las reacciones a la vez.