Курс языка программирования 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) 🆕


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