Курс по Raku / Функционално, паралелно, реактивно и уеб програмиране / Паралелно програмиране / Обещания
Обети (Vow) 🆕
Когато сами извиквате $p.keep(...), всеки, който държи
$p, би могъл да го уреди. Понякога искате обратното: кодът,
който произвежда резултата, да е единственото нещо, на което е
позволено да уреди обещанието, докато всички останали могат само да го
чакат. Това разделяне е обет (vow).
Promise.new ви дава обещание; извикването на
.vow върху него връща Vow — изключителното
право да изпълните или счупите това обещание. Оттам нататък обещанието
се смята за достъпно само за четене: то се урежда през обета. Обичайната
форма е производител, който държи обета частен и връща само
обещанието:
sub after($seconds) {
my $p = Promise.new;
my $v = $p.vow; # взимаме правото да уреждаме
start {
sleep $seconds;
$v.keep("done after $seconds s"); # уреждаме го през обета
}
return $p; # извикващите получават само страната за четене
}
my $job = after(0.2);
say $job.status; # Planned
say await $job; # done after 0.2 sВзимането на обета прави обещанието наистина достъпно само за четене:
от този миг $p.keep и $p.break се отказват,
защото обетът вече притежава изключителното право да го урежда.
my $p = Promise.new;
my $v = $p.vow;
$p.keep(1); # умира: Access denied to keep/break this Promise; already vowedТака извикващият може да await-и обещанието, да свърже
.then с него или да провери неговия .status,
но не може да го уреди — това може само притежателят на обета. Точно
така библиотеките превръщат API-та, базирани на обратни извиквания и
събития, в обикновени обещания: създават обещание, държат обета му и го
изпълняват отвътре в обратното извикване, когато събитието най-сетне
настъпи.
Това е и точно каквото start прави за вас зад кулисите —
той създава обещание, задържа обета за себе си и урежда обещанието със
стойността на блока (или го счупва, ако блокът умре). Създаването на
обещанието и обета му на ръка просто ви позволява да направите същото,
когато резултатът не идва от един-единствен блок код.
Навигация в курса
← Състоянието на обещание 🆕 | Свържете обещания във верига →
💪 Или преминете направо към упражненията в този
раздел.