Обычный шаблон - написать что-то вроде этого:
await Promise.anyof($the-promise, Promise.in(10));
if $the-promise {
# it finished ahead of the timeout
}
else {
# it timed out
}
Это не проявляется как неисправность Promise
, хотя это не так уж и плохо (поскольку в любом случае во многих случаях нужно отличать отмену от ошибки, поэтому вам все равно придется выполнить какое-то сопоставление с типом исключения). Этот факторинг также имеет то преимущество, что вам $the-promise
не обязательно иметь тот, который у вас есть, чтобы сохранить / сломать.
Можно также обернуть это примерно так:
class TimedOut is Exception {}
sub timeout($promise, $time) {
start {
await Promise.anyof($promise, Promise.in($time));
$promise ?? await($promise) !! die(TimedOut.new)
}
}
Который снова будет работать с любым $promise
, передаст результат или исключение и в противном случае выдаст исключение по тайм-ауту.
Следует помнить, что они фактически не влияют на отмену незавершенного производства. Это может не иметь значения, или это может быть важно. Если последнее, вы, вероятно, захотите либо:
- A,
Promise
который вы используете для передачи отмены, произошедшей; вы сохраняете его при отмене и опрашиваете его в коде, который будет выполнять отмену
- Чтобы посмотреть, используя
Supply
вместо этого парадигму, где есть модель отмены (закрытие крана).