Курс 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) 🆕


💪 Або перейдіть одразу до вправ цього розділу.