Um padrão comum é escrever algo como isto:
await Promise.anyof($the-promise, Promise.in(10));
if $the-promise {
# it finished ahead of the timeout
}
else {
# it timed out
}
Isso não se manifesta como quebrado Promise
, embora não seja de todo ruim (já que, em muitos casos, você precisa distinguir cancelamento x erro), então você ainda precisa fazer alguma correspondência no tipo de exceção). Esse fatoramento também tem a vantagem de que $the-promise
não é necessário que você tenha acesso para manter / interromper.
Pode-se também resumir isso em algo assim:
class TimedOut is Exception {}
sub timeout($promise, $time) {
start {
await Promise.anyof($promise, Promise.in($time));
$promise ?? await($promise) !! die(TimedOut.new)
}
}
O que funcionará novamente com qualquer um $promise
, transmitirá o resultado ou a exceção e lançará uma exceção de tempo limite.
O ponto a ter em mente com tudo isso é que eles não efetivamente cancelam o trabalho em andamento. Isso pode não importar, ou pode ser importante. Neste último caso, você provavelmente desejará:
- Um
Promise
que você usa para transmitir o cancelamento; você a mantém durante o cancelamento e a pesquisa no código que fará o cancelamento
- Em
Supply
vez disso, observe o uso do paradigma, onde existe um modelo de cancelamento (fechando a torneira).