일반적인 패턴은 다음과 같이 작성하는 것입니다.
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
대신 취소 모델이있는 패러다임 을 사용하는 방법을 살펴보십시오 (탭 닫기).