どのように私は楽で約束をタイムアウトすることができますか?

JJA:

私はスケジュールすることができます知っているPromiseと一定時間内に維持することが

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

しかし、どのように私は破られるためにそれをスケジュールすることができますか?具体的には、私は、それは時間の一定量まで持っていることは、「タイムアウト」に保持することになるか、そうでなければ失敗する約束を考えています。

私は別でこれを行うことができます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あなたはキープ/ブレークへのアクセス権を持っていることを1にする必要はありませんが。

一つは、また、このようなもので、このアップをラップできます。

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(タップを閉じ)のキャンセルモデルがある場合、代わりにパラダイムを。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=30402&siteId=1