Курс языка программирования 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 и комбинировать как любой другой.

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

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


💪 Или перейдите сразу к упражнениям этого раздела.