Un patrón común es escribir algo como esto:
await Promise.anyof($the-promise, Promise.in(10));
if $the-promise {
# it finished ahead of the timeout
}
else {
# it timed out
}
Eso no se manifiesta como roto Promise
, aunque eso no es del todo malo (ya que de todos modos necesita distinguir la cancelación frente al error, por lo que aún tendría que hacer algunas coincidencias en el tipo de excepción). Esta factorización también tiene la ventaja de que $the-promise
no tiene que ser una a la que tenga acceso para mantener / romper.
También se podría resumir esto en algo como esto:
class TimedOut is Exception {}
sub timeout($promise, $time) {
start {
await Promise.anyof($promise, Promise.in($time));
$promise ?? await($promise) !! die(TimedOut.new)
}
}
Que de nuevo funcionará con cualquiera $promise
, pasará el resultado o la excepción, y lanzará una excepción de tiempo de espera de otra manera.
Lo que hay que tener en cuenta con todo esto es que en realidad no efectúan ninguna cancelación del trabajo en progreso. Eso puede no importar, o puede ser importante. Si es lo último, probablemente querrás:
- A
Promise
que utilizas para transmitir la cancelación que ha tenido lugar; lo guarda al cancelar y lo sondea en el código que hará la cancelación
- Para ver el uso del
Supply
paradigma en su lugar, donde hay un modelo de cancelación (cerrando el grifo).