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

Собствено обещание 🆕

Всяко обещание досега идваше от start. Но можете да създадете такова и направо с Promise.new — обещание, което още не е приключило, — и да го уредите сами, когато резултатът (или новината) е готов. .keep го изпълнява със стойност:

my $p = Promise.new;   # ново, неуредено обещание

$p.keep(42);           # изпълняваме го със стойност
say await $p;          # 42

.break е случаят на провал. Изчакването на счупено обещание хвърля грешката отново, точно както при блок start, който е умрял — и ако никой не я прихване, това изключение спира програмата:

my $p = Promise.new;
$p.break('disk full');

say await $p;             # тук умира с 'disk full'
say 'never reached';      # този ред не се изпълнява

За да продължите, прихванете провала с try, точно както бихте направили около всеки код, който може да умре:

my $p = Promise.new;
$p.break('disk full');

my $result = try await $p;
say $result // "the job failed: $!"; # the job failed: disk full

Ако изходът вече е известен, две скъсявания създават обещание, което започва уредено: Promise.kept($value) и Promise.broken($error).

say await Promise.kept(7); # 7

Защо да създавате обещание на ръка? Защото не всеки резултат идва от блок start. Събитие, което ще се задейства по-късно, съобщение, което ще пристигне, обратно извикване от друга библиотека — Promise.new ви позволява да превърнете всяко от тях в обещание, което останалата част от програмата може да await-и и да съчетава като всяко друго.

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

Тест — Комбиниране на обещания   |   Състоянието на обещание 🆕


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