Курс 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-ити й поєднувати, як і будь-яку іншу.
Навігація курсом
← Тест — Комбінування промисів | Статус промиса 🆕 →
💪 Або перейдіть одразу до вправ цього розділу.