достичь JS SetTimeout функциональности в Perl - PullRequest
0 голосов
/ 02 октября 2018

Как мне достичь функциональности Javascript setTimeout в Perl?Это фрагмент кода JavaScript, который я пытаюсь написать на Perl.Возможно ли это с помощью потоков?

alert("Event 1 occured");
setTimeout(function(){ alert("3 seconds elapsed"); }, 3000);
alert("Event 2 occured");

Вывод:

 Event 1 occured
 Event 2 occured
 3 seconds elapsed

У меня Perl 5.18.2 и я на Mac OSX

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

См. Функцию будильник .В противном случае рассмотрите threads.pm или, если вы хотите получить паритет возможностей с Javascript, один из циклов событий, например AnyEvent или Mojo :: IOLoop или IO :: Async .

С потоками ваш пример будет:

use strict;
use threads;
print("Event 1 occured\n");
async {
    sleep 3;
    print "3 seconds elapsed\n";
};
print("Event 2 occured\n");
$_->join for threads->list; # to wait until all threads have finished
0 голосов
/ 02 октября 2018

Нет необходимости в потоках, и они не очень хороши в Perl .Вы можете использовать цикл обработки событий так же, как это делает JavaScript, но в ядре Perl его просто нет.Двумя популярными и хорошо поддерживаемыми экосистемами цикла событий являются IO :: Async и Mojo :: IOLoop (цикл событий, стоящий за веб-инфраструктурой Mojolicious).Основное отличие состоит в том, что, в отличие от JavaScript, цикл обработки событий не запускается до тех пор, пока что-то его не запустит.

use strict;
use warnings;
use IO::Async::Loop;
print "Event 1 occurred\n";
my $future = IO::Async::Loop->new->delay_future(after => 3)->on_done(sub { print "3 seconds elapsed\n" });
print "Event 2 occurred\n";
$future->await; # run event loop until Future has been resolved

use strict;
use warnings;
use Mojo::IOLoop;
print "Event 1 occurred\n";
Mojo::IOLoop->timer(3 => sub { print "3 seconds elapsed\n" });
print "Event 2 occurred\n";
Mojo::IOLoop->start; # run event loop until no more events to wait for

Ознакомьтесь с Mojolicious поваренной книгой для очень высокого уровня обзора циклов событийи неблокирующий код.

...