Raku'da nasıl bir söz verebilirim?


9

PromiseA'nın belirli bir sürede saklanması için zamanlama yapabileceğimi biliyorum

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

ama kırılmasını nasıl planlayabilirim? Özellikle, "zaman aşımı" yapacak bir vaat düşünüyorum, böylece tutulması için belirli bir süre kadar ya da başarısız olacaktır.

Bunu başka biriyle yapabilirim Promise, şöyle:

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

Ama bu biraz ... savurgan hissettiriyor. Bunu yapmanın daha iyi bir yolu var mı?

Yanıtlar:


10

Ortak bir örüntü böyle bir şey yazmaktır:

await Promise.anyof($the-promise, Promise.in(10));
if $the-promise {
    # it finished ahead of the timeout
}
else {
    # it timed out
}

Bu kendini bir kırık olarak göstermez Promise, ancak hepsi kötü değil (çünkü zaten birçok durumda iptal ile hatayı birbirinden ayırmanız gerekir, bu nedenle istisna türünde bazı eşleştirme yapmanız gerekir). Bu faktoring $the-promise, tutma / kırma erişimine sahip olmanız gerekmeyen bir avantaja da sahiptir .

Birisi de böyle bir şeye sarılabilir:

class TimedOut is Exception {}
sub timeout($promise, $time) {
    start {
        await Promise.anyof($promise, Promise.in($time));
        $promise ?? await($promise) !! die(TimedOut.new)
    }
}

Bu yine herhangi biriyle çalışacak $promise, sonucu veya istisnayı aktaracak ve aksi takdirde zaman aşımı istisnası atacaktır.

Tüm bunlara dikkat etmeniz gereken şey, devam etmekte olan işin iptalini gerçekten etkilememesidir. Bu önemli olmayabilir veya önemli olabilir. İkincisi ise, muhtemelen aşağıdakilerden birini isteyeceksiniz:

  • PromiseYapılan iptal işlemlerini iletmek için kullandığınız A ; iptal ederken saklarsınız ve iptal işlemini gerçekleştirecek kodda anket yaparsınız
  • Bunun Supplyyerine, bir iptal modelinin bulunduğu (musluğu kapatarak) paradigmayı kullanmaya bakmak için .

3
Teşekkürler. Bu kullanışlı. Ve en azından vaat ucuz (!) Ve onları önerdiğiniz gibi kullanmak ya da başlangıçta nasıl düşündüm, eve götürmek Tamam. Hala "bu söz X saniyede tutulmazsa, o zaman kırılmış sayılır" demenin (daha fazla?) Basit bir yolu olması gerektiğini düşünüyor. Her durumda mantıklı olmayacağını anlıyorum, ancak bazılarında kesinlikle mantıklı olduğunu düşünüyorum.
jja

3
Muhtemelen gelecekte de gelecektir, ancak muhtemelen sadece Promiseözünde bir tür iptal hükümlerimiz olduğunda, anlambilimleri bunlarla biraz bağlantılı olacaktır.
Jonathan Worthington
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.