Курс языка программирования Raku / Функциональное, конкурентное, реактивное и веб-программирование / Конкурентное программирование / Промисы
Статус промиса 🆕
Промис всегда находится в одном из трёх состояний, о которых сообщает
его метод .status:
Planned— ещё не улажен;Kept— завершился со значением;Broken— его работа бросила исключение.
Это значения перечисления PromiseStatus. Чтение
.status не ждёт — оно сообщает, где промис находится
прямо сейчас, поэтому проверить его можно и до того, как промис
уладился, и после:
my $p = start { sleep 1; 10 };
say $p.status; # Planned — читаем сразу, пока блок ещё работает
await $p; # теперь дожидаемся завершения
say $p.status; # Kept
say $p.result; # 10.result даёт исполненное значение. В отличие от
.status, он ждёт, пока промис не уладится, поэтому
на незавершённом промисе блокирует выполнение точно как
await. А если промис был сломан, .result
заново бросает исключение.
Когда хочется взглянуть на неудачу, не бросая её заново, используйте
.cause — объект исключения сломанного промиса:
my $p = start { die 'boom' };
try await $p; # даём ему уладиться (и проглатываем заново брошенную ошибку)
say $p.status; # Broken
say $p.cause.message; # boomИтак, .status и .cause исследуют промис, не
тревожа его, а await и .result забирают его
исход — значение или заново брошенную ошибку.
Навигация по курсу
← Собственный промис 🆕 | Обещания (Vow) 🆕 →
💪 Или перейдите сразу к упражнениям этого
раздела.