Курс по 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 прави за вас зад кулисите — той създава обещание, задържа обета за себе си и урежда обещанието със стойността на блока (или го счупва, ако блокът умре). Създаването на обещанието и обета му на ръка просто ви позволява да направите същото, когато резултатът не идва от един-единствен блок код.

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

Състоянието на обещание 🆕   |   Свържете обещания във верига


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