一般的なパターンは次のようなものを書くことです:
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
代わりに、(タップを閉じる)キャンセルモデルがあるパラダイムの使用方法を確認します。