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 )