Answers:
一个常见的模式是写这样的东西:
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)
}
}
它将再次与any一起使用$promise
,传递结果或异常,否则抛出超时的异常。
所有这些要记住的是,它们实际上并不会影响正在进行的工作。这可能无关紧要,或者可能很重要。如果是后者,则可能需要:
Promise
您用来传达已发生的取消的A ;您可以在取消时保留它,并在进行取消的代码中对其进行轮询Supply
范式的情况,那里有一个取消模型(关闭抽头)。Promise
在核心中也有某种取消条款时,因为它的语义会与这些条款有联系。