Курс по 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-и и да съчетава като всяко друго.
Навигация в курса
← Тест — Комбиниране на обещания | Състоянието на обещание 🆕 →
💪 Или преминете направо към упражненията в този
раздел.