В Perl 6 есть понятие промисов и, соответственно, тип данных Promise. Давайте разберем одну простую программу, которая частично приоткрывает идею, как вы можете использовать промисы с своих программах.
my $promise = Promise.new; start { sleep 3; $promise.keep; } for 1..* { .say; sleep 1; last if $promise; }
Сначала создается объект типа Promise, он сохраняется в одноименной переменной $promise. Затем создается отдельный поток, который через три секунды делает промис (обещание) выполненным:
$promise.keep;
Основной тред программы начинает раз в секунду печатать в консоль и проверять, не сдержано ли обещание. Если оно сдержано, цикл завершается:
last if $promise;
В итоге программа печатает числа от одного до трех:
$ perl6 promise.pl 1 2 3
После создания промис находится в состоянии Planned. Это одно из возможных состояний. Два других — обещание выполнено или нарушено: Kept или Broken.
Посмотреть текущий статус можно с помощью метода status:
my $promise = Promise.new; say $promise.status; # Planned
Методы keep и break изменяют состояние промиса, например:
$promise.break; say $promise.status; # Broken
В булевом контексте сдержанный промис становится истиной, а нарушеный или запланированный — ложью. Именно это преобразование к булевой величине и используется в нашей программе. Альтернативно можно было бы написать все явно:
last if $promise.status eq 'Kept';
Обратите также внимание, что изменение состояние промиса и его чтение были сделаны в разных потоках.
One thought on “52. Пара слов о промисах в Perl 6”