Raku-Kurs / Funktionale, nebenläufige, reaktive und Web-Programmierung / Nebenläufige Programmierung / Promises

Verketten und kombinieren

Promises werden noch mächtiger, wenn Sie sie verbinden. Am häufigsten gebraucht wird das Warten auf mehrere zugleich. await nimmt eine Liste von Promises auf und liefert ihre Ergebnisse in derselben Reihenfolge:

my @jobs = (start { 1 }), (start { 2 }), (start { 3 });
say await @jobs;     # (1 2 3)
say [+] await @jobs; # 6

Die drei Aufgaben laufen nebenläufig; await @jobs wartet auf alle und reicht (1, 2, 3) zurück. Da die Ergebnisse in derselben Reihenfolge wie die Promises zurückkommen, können Sie sie wie gewohnt reduzieren.

Sie können mit .then auch Arbeit an ein Promise anhängen, was einen Folgeblock ausführt, sobald das Promise fertig ist. Darin ist .result der Wert des ursprünglichen Promise:

my $p = start { 10 };
my $q = $p.then({ .result * 2 });
say await $q; # 20

$q ist ein neues Promise, das das Ergebnis von $p verdoppelt. Es abzuwarten ergibt 20.

Der Block hat keinen ausdrücklichen Parameter, er erhält das fertige Promise also als Themenvariable $_ — weshalb ein blankes .result funktioniert: Es ist in Wahrheit $_.result. Möchten Sie diesem Promise lieber einen Namen geben, nehmen Sie einen Pointy Block:

my $q = $p.then(-> $prev { $prev.result * 2 });

Das verhält sich genau gleich; $prev ist das ursprüngliche Promise $p, und $prev.result ist sein Wert.

Mit start, await und .then können Sie ganze Pipelines nebenläufiger Arbeit beschreiben: viele Aufgaben starten, ihre Ergebnisse verbinden und aus alten neue Aufgaben bauen — und das alles, ohne je einen Thread unmittelbar anzufassen.

Praxis

Lösen Sie 1 Quiz zum Inhalt dieses Themas.

Kursnavigation

Quiz — Promises   |   Quiz — Promises kombinieren


💪 Oder springen Sie direkt zu den Übungen dieses Abschnitts.