ฉันจะหมดเวลาสัญญาใน Raku ได้อย่างไร


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)
    }
}

ซึ่งจะใช้งานได้อีกครั้ง$promiseส่งผ่านผลลัพธ์หรือข้อยกเว้นและโยนข้อยกเว้นการหมดเวลาเป็นอย่างอื่น

สิ่งที่ควรคำนึงถึงทั้งหมดนี้คือพวกเขาไม่มีผลกระทบใด ๆ กับการยกเลิกงานที่กำลังดำเนินอยู่ นั่นอาจไม่สำคัญหรืออาจสำคัญ หากหลังคุณอาจต้องการ:

  • A Promiseที่คุณใช้เพื่อสื่อถึงการยกเลิกที่เกิดขึ้น คุณเก็บไว้เมื่อยกเลิกและโพลในรหัสที่จะทำการยกเลิก
  • เพื่อดูการใช้Supplyกระบวนทัศน์แทนซึ่งมีรูปแบบการยกเลิก (ปิดการแตะ)

3
ขอบคุณ สิ่งนี้มีประโยชน์ และอย่างน้อยที่สุดมันก็ขับรถกลับบ้านที่สัญญานั้นราคาถูก (!) และใช้พวกเขาทั้งที่คุณแนะนำหรือวิธีที่ฉันคิดไว้ในตอนแรกก็โอเค มันยังรู้สึกเหมือนว่าควรจะมีวิธีที่ตรงไปตรงมามากกว่าในการพูดว่า "ถ้าสัญญานี้ไม่ได้ถูกเก็บไว้ใน X วินาทีแล้วพิจารณาว่ามันพัง" ฉันเข้าใจว่ามันไม่สมเหตุสมผลในทุกกรณี แต่ฉันคิดว่ามันสมเหตุสมผลในบางกรณี
jja

3
มันอาจจะมาในอนาคตอย่างไรก็ตามอาจเกิดขึ้นได้ก็ต่อเมื่อเรามีPromiseบทบัญญัติการยกเลิกบางอย่างในแกนกลางเช่นกันเนื่องจากความหมายของมันจะเชื่อมโยงกับสิ่งเหล่านั้น
Jonathan Worthington
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.