Курс по Raku / Функционално, паралелно, реактивно и уеб програмиране / Паралелно програмиране / Обещания

Състоянието на обещание 🆕

Обещанието винаги е в едно от три състояния, съобщавани от метода му .status:

  • Planned — още не е уредено;
  • Kept — приключило е със стойност;
  • Broken — работата му е хвърлила изключение.

Това са стойностите на изброения тип PromiseStatus. Четенето на .status не чака — то ви казва къде е обещанието точно сега, така че можете да го проверите и преди то да се уреди, и после:

my $p = start { sleep 1; 10 };

say $p.status; # Planned — прочетено веднага, докато блокът още работи
await $p;      # сега изчакваме да приключи
say $p.status; # Kept
say $p.result; # 10

.result дава запазената стойност. За разлика от .status, той чака, докато обещанието се уреди, така че върху неприключило обещание блокира точно като await. А ако обещанието е било счупено, .result хвърля изключението отново.

Когато искате да погледнете провала, без да го хвърляте отново, използвайте .cause — обекта на изключението на счупеното обещание:

my $p = start { die 'boom' };
try await $p;         # оставяме го да се уреди (и поглъщаме повторно хвърлената грешка)
say $p.status;        # Broken
say $p.cause.message; # boom

Така .status и .cause разглеждат обещанието, без да го безпокоят, докато await и .result събират изхода му — стойността или повторно хвърлената грешка.

Навигация в курса

Собствено обещание 🆕   |   Обети (Vow) 🆕


💪 Или преминете направо към упражненията в този раздел.