Курс 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-ити й поєднувати, як і будь-яку іншу.

Навігація курсом

Тест — Комбінування промисів   |   Статус промиса 🆕


💪 Або перейдіть одразу до вправ цього розділу.