Come posso scadere una promessa in Raku?


9

So che posso programmare un Promiseper essere tenuto in un determinato periodo di tempo con

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

ma come posso programmare che si rompa? In particolare, sto pensando a una promessa che "scadrà", in modo che abbia un certo periodo di tempo da mantenere, altrimenti fallirà.

Posso farlo con un altro Promise, in questo modo:

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

Ma questo sembra un po '... dispendioso. C'è un modo migliore per farlo?

Risposte:


10

Uno schema comune è scrivere qualcosa del genere:

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

Ciò non si manifesta come interrotto Promise, anche se non è affatto negativo (poiché in molti casi è necessario distinguere la cancellazione dall'errore in molti casi, quindi si dovrebbe comunque fare una corrispondenza sul tipo di eccezione). Questo factoring ha anche il vantaggio che $the-promisenon deve essere uno che hai accesso per mantenere / rompere.

Si potrebbe anche concludere in qualcosa del genere:

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

Che funzionerà di nuovo con qualsiasi $promise, trasmette il risultato o l'eccezione e genera un'eccezione scaduta altrimenti.

La cosa da tenere a mente con tutti questi è che in realtà non hanno alcun effetto sulla cancellazione dei lavori in corso. Ciò potrebbe non importare o potrebbe essere importante. Se quest'ultimo, probabilmente vorrai:

  • A Promiseche usi per comunicare la cancellazione avvenuta; lo mantieni durante la cancellazione e lo scruti nel codice che farà la cancellazione
  • SupplyOsservare invece l'utilizzo del paradigma, in cui esiste un modello di annullamento (chiusura del rubinetto).

3
Grazie. Questo è utile E per lo meno porta a casa che le promesse sono economiche (!) E usarle come suggerisci tu, o come avevo pensato inizialmente, va bene. Sembra ancora che ci dovrebbe essere un (più?) Modo semplice per dire "se questa promessa non è stata mantenuta in X secondi, allora considera la sua rottura". Capisco che non avrà senso in tutti i casi, ma penso che abbia sicuramente senso in alcuni.
giovedì

3
Probabilmente arriverà in futuro, tuttavia probabilmente solo quando avremo anche una sorta di Promisedisposizioni di annullamento nel nucleo, poiché la sua semantica sarà in qualche modo legata a quelle.
Jonathan Worthington,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.