Concurrency is not my big strength, so this will likely turn out to be a bit more clunky than necessary.
One possible trick is to use the Promise.anyof combinator to get the first of the timeout or the actual receiving action:
my $c = channel("Message"); say "Listening"; loop { my $timeout = Promise.in(1.75); my $result = start { $c.receive } my $combined = Promise.anyof( $result , $timeout); await $combined.then({ if $result { say $result.result; } else { say 'timeout'; } }) }
This puts a timeout on every individual .receive, but finishes early if a value is available earlier. It's also not a busy loop, so doesn't use much CPU.
I'm sure there are much more elegant solutions out there if you use a supply instead of a channel to generate the values; maybe some of the promise combinators like zip-latest can be used then.
In reply to Re: Perl6: react/whenever timeout
by moritz
in thread Perl6: react/whenever timeout
by OneTrueDabe
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |