Raku-Kurs / Funktionale, nebenläufige, reaktive und Web-Programmierung / Nebenläufige Programmierung / Promises
Ein eigenes Promise 🆕
Jedes Promise bisher kam von start. Sie können aber auch
unmittelbar eines mit Promise.new erzeugen — ein Promise,
das noch nicht fertig ist — und es selbst erledigen, wenn das Ergebnis
(oder die Nachricht) bereitsteht. .keep erfüllt es mit
einem Wert:
my $p = Promise.new; # a fresh, unsettled promise
$p.keep(42); # fulfil it with a value
say await $p; # 42.break ist der Fehlschlagfall. Ein gebrochenes Promise
abzuwarten wirft den Fehler erneut, genau wie bei einem
start-Block, der gestorben ist — und
fängt niemand die Ausnahme, hält sie das Programm an:
my $p = Promise.new;
$p.break('disk full');
say await $p; # dies here with 'disk full'
say 'never reached'; # this line does not runUm weiterzumachen, fangen Sie den Fehlschlag mit try,
genau wie um jeden Code, der sterben könnte:
my $p = Promise.new;
$p.break('disk full');
my $result = try await $p;
say $result // "the job failed: $!"; # the job failed: disk fullSteht der Ausgang bereits fest, erzeugen zwei Abkürzungen ein
Promise, das schon erledigt beginnt: Promise.kept($value)
und Promise.broken($error).
say await Promise.kept(7); # 7Warum ein Promise von Hand erzeugen? Weil nicht jedes Ergebnis aus
einem start-Block kommt. Ein Ereignis, das später eintritt,
eine Nachricht, die ankommt, ein Rückruf aus einer anderen Bibliothek —
mit Promise.new machen Sie aus jedem davon ein Promise, das
der Rest des Programms await-en und wie jedes andere
verbinden kann.
Kursnavigation
← Quiz — Promises kombinieren | Der Status eines Promise 🆕 →
💪 Oder springen Sie direkt zu den Übungen dieses
Abschnitts.