Курс языка программирования Raku / Функциональное, конкурентное, реактивное и веб-программирование / Реактивное программирование / await / Ожидание промиса
Тест — await и sleep
Что делает следующая программа?
my $p = start { sleep 2; 42 };
say 'waiting';
say await $p;| 1 | Сразу печатает waiting, а примерно через две секунды печатает 42 |
| 0 | Делает паузу в две секунды, затем печатает waiting и 42 вместе |
| 0 | Сразу печатает waiting и 42 — sleep происходит в фоне |
| 0 | Печатает waiting, затем Promise — спящий промис дождаться нельзя |
start возвращает промис немедленно:
блок вместе со своим sleep выполняется в фоновом потоке.
Поэтому say 'waiting' срабатывает сразу же. Блокирует
выполнение именно await: программа приостанавливается на
нём, пока фоновый блок не досмотрит свой двухсекундный сон и не выдаст
42, которое затем печатается. Пауза принадлежит строке с
await, а не строке со start.