รูปแบบทั่วไปคือการเขียนสิ่งนี้:
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
กระบวนทัศน์แทนซึ่งมีรูปแบบการยกเลิก (ปิดการแตะ)