Corso di Raku / Programmazione funzionale, concorrente, reattiva e web / Programmazione concorrente / Promise
Una promise tutta vostra 🆕
Ogni promise vista finora veniva da start. Ma puoi anche
crearne una direttamente con Promise.new — una promise non
ancora conclusa — e concluderla tu quando il risultato (o la notizia) è
pronto. .keep la soddisfa con un valore:
my $p = Promise.new; # a fresh, unsettled promise
$p.keep(42); # fulfil it with a value
say await $p; # 42.break è il caso di fallimento. Attendere una promise
rotta rilancia l’errore, proprio come fa per un blocco
start che è morto — e se nulla la
intercetta, quell’eccezione ferma il programma:
my $p = Promise.new;
$p.break('disk full');
say await $p; # dies here with 'disk full'
say 'never reached'; # this line does not runPer proseguire, intercetta il fallimento con try,
esattamente come faresti attorno a qualunque codice che potrebbe
morire:
my $p = Promise.new;
$p.break('disk full');
my $result = try await $p;
say $result // "the job failed: $!"; # the job failed: disk fullSe l’esito è già noto, due scorciatoie creano una promise che nasce
già conclusa: Promise.kept($value) e
Promise.broken($error).
say await Promise.kept(7); # 7Perché costruire una promise a mano? Perché non ogni risultato viene
da un blocco start. Un evento che scatta più tardi, un
messaggio che arriva, una callback da un’altra libreria —
Promise.new ti permette di trasformare ognuna di queste
cose in una promise che il resto del programma può attendere e combinare
come qualunque altra.
Navigazione del corso
← Quiz — Combinare le promise | Lo stato di una promise 🆕 →
💪 Oppure vai direttamente agli esercizi di questa
sezione.