Поширений зразок - написати щось подібне:
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
, передає результат або виняток, а іншим чином викидає вичерпаний виняток.
Слід пам’ятати про все це в тому, що вони фактично не роблять жодного скасування незавершеного виробництва. Це може не мати значення, або це може бути важливо. Якщо останнє, ви, ймовірно, захочете:
- А
Promise
, Який використовується для передачі скасування відбувся; ви зберігаєте його під час скасування та запитуєте його в коді, який буде робити скасування
- Подивитись на використання
Supply
парадигми замість того, де є модель скасування (закриття крана).