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