라쿠에서 약속 시간을 어떻게 초과 할 수 있습니까?


9

일정 Promise시간 동안 일정 을 유지할 수 있음을 알고 있습니다.

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

하지만 어떻게 부서 지도록 예약 할 수 있습니까? 특히, "시간 초과"로 인해 약속을 지키는 데 일정 시간이 걸리거나 실패 할 것이라는 약속을 생각하고 있습니다.

나는 다른 Promise처럼 이것을 할 수 있습니다 :

my $promise = Promise.new;
...
Promise.in($seconds).then: { $promise.break };

그러나 이것은 약간 낭비입니다 ... 낭비입니다. 더 좋은 방법이 있습니까?

답변:


10

일반적인 패턴은 다음과 같이 작성하는 것입니다.

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대신 취소 모델이있는 패러다임 을 사용하는 방법을 살펴보십시오 (탭 닫기).

3
감사. 유용합니다. 그리고 최소한 약속이 싸다는 것을 가정으로 몰아 넣습니다. (!) 당신이 제안했거나 원래 내가 생각했던 것처럼 약속을 사용하는 것이 좋습니다. "이 약속이 X 초 안에 유지되지 않으면 깨 졌다고 생각한다"고 말하는 (더?) 간단한 방법이 있어야 할 것 같습니다. 나는 모든 경우에 의미가 없다고 생각하지만, 어떤 경우에는 분명히 의미가 있다고 생각합니다.
jja

3
그것은 아마도 미래에 올 것이지만, 우리의 Promise핵심에 일종의 취소 조항 이있을 때만 의미가 있습니다.
조나단 워싱턴
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.