AnyEvent-Delay
view release on metacpan or search on metacpan
lib/AnyEvent/Delay.pm view on Meta::CPAN
return sub {
$self->_step($id, @_, @mark)
};
}
sub steps {
my $self = shift;
$self->{steps} = [@_];
$self->begin->();
#$self->{timers}{-1} = EV::timer 0, 0, $self->begin;
return $self;
}
sub _step {
my ($self, $id) = (shift, shift);
push @{ $self->{args}[$id] }, [@_];
return if $self->{fail} || --$self->{pending} || $self->{lock};
local $self->{lock} = 1;
lib/AnyEvent/Delay.pm view on Meta::CPAN
$self->{_ae_counter} = 0;
if (my $cb = shift @{$self->{steps} ||= []}) {
eval { $self->$cb(@args); 1 } or return $self->on_error->($@) and $self->{fail}++;
}
if (! $self->{_ae_counter}) {
return $self->on_finish->( @args );
}
if (! $self->{pending}) {
$self->{timers}{$id} = EV::timer 0, 0, $self->begin
}
}
1;
=encoding utf8
=head1 NAME
AnyEvent::Delay - Manage AnyEvent callbacks and control the flow of events
=head1 SYNOPSIS
# Synchronize multiple events
my $cv = AE::cv;
my $delay = AnyEvent::Delay->new();
$delay->on_finish(sub { say 'BOOM!'; $cv->send });
for my $i (1 .. 10) {
my $end = $delay->begin;
Mojo::IOLoop->timer($i => sub {
say 10 - $i;
$end->();
});
}
$cv->recv;
# Sequentialize multiple events
my $cv = AE::cv;
my $delay = AnyEvent::Delay->new();
$delay->steps(
# First step (parallel events)
sub {
my $delay = shift;
Mojo::IOLoop->timer(2 => $delay->begin);
http_get( 'http://www.yinyuetai.com' => $delay->begin );
say 'Second step in 2 seconds.';
},
# Second step (parallel timers)
sub {
my ($delay, @args) = @_;
say "This http response is $args[1]->[1]{Status}";
Mojo::IOLoop->timer(1 => $delay->begin);
Mojo::IOLoop->timer(3 => $delay->begin);
say 'Third step in 3 seconds.';
},
# Third step (the end)
sub {
my ($delay, @args) = @_;
say 'And done after 5 seconds total.';
$cv->send;
}
);
( run in 0.924 second using v1.01-cache-2.11-cpan-49f99fa48dc )