Một mô hình phổ biến là viết một cái gì đó như thế này:
await Promise.anyof($the-promise, Promise.in(10));
if $the-promise {
# it finished ahead of the timeout
}
else {
# it timed out
}
Điều đó không có vẻ như là một sự cố Promise
, mặc dù điều đó không phải là xấu (vì bạn cần phân biệt hủy bỏ với lỗi trong nhiều trường hợp, vì vậy bạn vẫn phải thực hiện một số khớp với loại ngoại lệ). Bao thanh toán này cũng có một ưu điểm là $the-promise
không phải là một thứ mà bạn có quyền truy cập để giữ / phá vỡ.
Người ta cũng có thể gói nó trong một cái gì đó như thế này:
class TimedOut is Exception {}
sub timeout($promise, $time) {
start {
await Promise.anyof($promise, Promise.in($time));
$promise ?? await($promise) !! die(TimedOut.new)
}
}
Cái nào sẽ lại hoạt động với bất kỳ $promise
, chuyển qua kết quả hoặc ngoại lệ và ném ngoại lệ đã hết thời gian khác.
Điều cần lưu ý với tất cả những điều này là chúng không thực sự ảnh hưởng đến bất kỳ sự hủy bỏ công việc nào đang diễn ra. Điều đó có thể không quan trọng, hoặc nó có thể quan trọng. Nếu sau này, có lẽ bạn sẽ muốn:
- A
Promise
mà bạn sử dụng để truyền đạt sự hủy bỏ đã diễn ra; bạn giữ nó khi hủy và bỏ phiếu trong mã sẽ thực hiện hủy
Supply
Thay vào đó, để xem xét sử dụng mô hình, nơi có mô hình hủy (đóng vòi).