Làm thế nào tôi có thể hết thời gian một lời hứa trong Raku?


9

Tôi biết tôi có thể lên lịch Promiseđể được giữ trong một khoảng thời gian nhất định với

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

nhưng làm thế nào tôi có thể lên lịch để nó bị phá vỡ? Cụ thể, tôi đang nghĩ về một lời hứa sẽ "hết thời gian", để nó có thể giữ đến một khoảng thời gian nhất định nếu không nó sẽ thất bại.

Tôi có thể làm điều này với cái khác Promise, như vậy:

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

Nhưng điều này cảm thấy một chút ... lãng phí. Có cách nào tốt hơn để làm điều này?

Câu trả lời:


10

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-promisekhô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 Promisemà 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
  • SupplyThay vào đó, để xem xét sử dụng mô hình, nơi có mô hình hủy (đóng vòi).

3
Cảm ơn. Điều này rất hữu ích. Và ít nhất nó lái xe về nhà hứa hẹn là rẻ (!) Và sử dụng chúng như bạn đề xuất, hoặc cách tôi nghĩ ban đầu, là ổn. Vẫn có cảm giác như nên có một cách nói đơn giản (hơn?) "Nếu lời hứa này không được giữ trong X giây thì hãy xem nó đã bị phá vỡ". Tôi hiểu rằng nó sẽ không có ý nghĩa trong mọi trường hợp, nhưng tôi nghĩ nó chắc chắn có ý nghĩa trong một số trường hợp.
jja

3
Nó có thể sẽ đến trong tương lai, tuy nhiên có lẽ chỉ khi chúng ta có một số loại Promiseđiều khoản hủy bỏ trong cốt lõi, vì ngữ nghĩa của nó sẽ bị ràng buộc phần nào với những điều khoản đó.
Jonathan Worthington
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.