Cursus Raku / Functioneel, concurrent, reactief en webprogrammeren / Reactief programmeren / react en whenever / whenever
Quiz — whenever en done
Wat drukt het volgende programma af?
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] |
De eerste whenever duwt 1 erin, dan
2 — en bij 2 roept hij done aan.
Het cruciale punt is dat done het hele
react-blok beëindigt en niet alleen zijn eigen
whenever: de rest van de eerste supply (3) en
de hele tweede supply (10, 20) worden afgesneden
voordat ze afgeleverd worden. Dus @out bevat alleen
[1 2]. Als done alleen zijn eigen stroom stil
zou leggen, had je [1 2 10 20] gezien — maar één
done legt alle reacties tegelijk stil.