Raku-Kurs / Funktionale, nebenläufige, reaktive und Web-Programmierung / Reaktive Programmierung / await
Auf ein Promise warten
await nimmt ein Promise auf, wartet auf sein Ende und
liefert sein Ergebnis:
my $p = start { 7 * 6 };
say await $p; # 42Das Programm hält bei await nur so lange an, wie nötig,
und läuft dann mit dem Wert weiter, den das Promise erzeugt hat.
Bei mehreren Promises wartet await auf
alle und liefert ihre Ergebnisse in derselben
Reihenfolge wie die Promises in der Liste:
my @jobs = (start { 5 }), (start { 10 }), (start { 15 });
say await @jobs; # (5 10 15)
say [+] await @jobs; # 30Die Aufgaben laufen nebenläufig, doch await @jobs kehrt
erst zurück, wenn jede fertig ist. Jedes Ergebnis steht danach an
derselben Stelle wie sein Promise in @jobs — gleich, welche
Aufgabe zufällig zuerst fertig war.
Wurde ein abgewartetes Promise gebrochen — sein
Block warf eine Ausnahme —, wirft await diese Ausnahme an
der Stelle des await erneut. Fehler in Hintergrundarbeit
tauchen also dort auf, wo Sie darauf warten, sodass Sie sie mit dem
gewohnten try / CATCH aus dem Teil über
Ausnahmen behandeln können:
my $p = start { die 'no such file' };
my $result = try await $p;
say $result // "the job failed: $!";Das gibt aus:
the job failed: no such fileDas die geschieht auf einem Hintergrundthread, doch die
Ausnahme reist mit dem Promise mit und tritt beim await
hervor. Das try fängt sie dort, lässt $result
undefiniert und den Fehler in $! — ein Fehlschlag in
nebenläufiger Arbeit wird also genau wie jede andere Ausnahme behandelt.
Beim Abwarten geht es daher nicht nur darum, einen Wert zu bekommen; es
ist der Augenblick, in dem sich nebenläufige Arbeit wieder in den
Hauptfluss einfügt, mit Ergebnissen wie mit Fehlern.
Praxis
Lösen Sie 2 Quizze zum Inhalt dieses Themas.
Kursnavigation
← await | Quiz — await →
💪 Oder springen Sie direkt zu den Übungen dieses
Abschnitts.