Pola umum adalah menulis sesuatu seperti ini:
await Promise.anyof($the-promise, Promise.in(10));
if $the-promise {
# it finished ahead of the timeout
}
else {
# it timed out
}
Itu tidak memanifestasikan dirinya sebagai rusak Promise
, meskipun itu tidak semuanya buruk (karena Anda perlu membedakan pembatalan vs kesalahan dalam banyak kasus, jadi Anda masih harus melakukan pencocokan pada jenis pengecualian). Anjak piutang ini juga memiliki keuntungan yang $the-promise
tidak harus Anda dapatkan / pertahankan.
Orang juga bisa membungkusnya dengan sesuatu seperti ini:
class TimedOut is Exception {}
sub timeout($promise, $time) {
start {
await Promise.anyof($promise, Promise.in($time));
$promise ?? await($promise) !! die(TimedOut.new)
}
}
Yang lagi-lagi akan bekerja dengan apa pun $promise
, meneruskan hasil atau pengecualian, dan membuang pengecualian batas waktu sebaliknya.
Yang perlu diingat dengan semua ini adalah bahwa mereka tidak benar-benar mempengaruhi pembatalan pekerjaan yang sedang berlangsung. Itu mungkin tidak penting, atau mungkin penting. Jika yang terakhir, Anda mungkin ingin:
- A
Promise
yang Anda gunakan untuk menyampaikan pembatalan telah terjadi; Anda menyimpannya saat membatalkan, dan polling dalam kode yang akan melakukan pembatalan
- Untuk melihat menggunakan
Supply
paradigma sebagai gantinya, di mana ada model pembatalan (menutup keran).