gpt4 book ai didi

promise - 如何在Raku中使 promise 超时?

转载 作者:行者123 更新时间:2023-12-03 16:13:03 24 4
gpt4 key购买 nike

我知道我可以安排Promise保留在给定的时间内

my $promise = Promise.in($seconds);

但是我该如何安排它被破坏?具体来说,我正在考虑一个将“超时”的 promise ,这样它最多可以保留一定的时间,否则将失败。

我可以用另一个 Promise来做到这一点,就像这样:
my $promise = Promise.new;
...
Promise.in($seconds).then: { $promise.break };

但这感觉有点...浪费。有一个更好的方法吗?

最佳答案

一个常见的模式是写这样的东西:

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范例的情况,该范例中有一个取消模型(关闭抽头)。
  • 关于promise - 如何在Raku中使 promise 超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60092359/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com