Corso di Raku / Programmazione funzionale, concorrente, reattiva e web / Programmazione reattiva / await
Attendere una promise
await prende una promise, aspetta che si completi e ne
restituisce il risultato:
my $p = start { 7 * 6 };
say await $p; # 42Il programma si mette in pausa all’await solo per il
tempo necessario, poi prosegue con il valore prodotto dalla promise.
Date parecchie promise, await le aspetta
tutte e restituisce i loro risultati nello stesso
ordine delle promise nell’elenco:
my @jobs = (start { 5 }), (start { 10 }), (start { 15 });
say await @jobs; # (5 10 15)
say [+] await @jobs; # 30I lavori girano in modo concorrente, ma await @jobs non
ritorna finché ognuno non è finito. Ogni risultato sta poi nella stessa
posizione della propria promise in @jobs, indipendentemente
da quale lavoro sia finito per primo.
Se una promise attesa era rotta — il suo blocco ha
sollevato un’eccezione — await rilancia quell’eccezione nel
punto dell’await. Questo significa che gli errori del
lavoro in secondo piano emergono là dove lo aspetti, così puoi gestirli
con i soliti try / CATCH della parte sulle
eccezioni:
my $p = start { die 'no such file' };
my $result = try await $p;
say $result // "the job failed: $!";Questo stampa:
the job failed: no such fileIl die avviene su un thread in secondo piano, ma
l’eccezione viaggia con la promise e salta fuori all’await.
Il try la intercetta lì, lasciando $result non
definito e l’errore in $! — così un fallimento nel lavoro
concorrente si gestisce esattamente come qualunque altra eccezione.
Attendere, quindi, non riguarda solo l’ottenere un valore: è il momento
in cui il lavoro concorrente si ricongiunge al flusso principale,
risultati ed errori compresi.
Pratica
Risolvi 2 quiz sul contenuto di questo argomento.
Navigazione del corso
← await | Quiz — await →
💪 Oppure vai direttamente agli esercizi di questa
sezione.