NAME

Mojo::IOLoop::Delay - Synchronize events

SYNOPSIS

use Mojo::IOLoop::Delay;

# Synchronize multiple events
my $delay = Mojo::IOLoop::Delay->new;
$delay->on(finish => sub { say 'BOOM!' });
for my $i (1 .. 10) {
  $delay->begin;
  Mojo::IOLoop->timer($i => sub {
    say 10 - $i;
    $delay->end;
  });
}

# Wait for events if necessary
$delay->wait unless Mojo::IOLoop->is_running;

DESCRIPTION

Mojo::IOLoop::Delay synchronizes events for Mojo::IOLoop.

EVENTS

Mojo::IOLoop::Delay can emit the following events.

finish

$delay->on(finish => sub {
  my ($delay, @args) = @_;
  ...
});

Emitted safely once the active event counter reaches zero.

ATTRIBUTES

Mojo::IOLoop::Delay implements the following attributes.

ioloop

my $ioloop = $delay->ioloop;
$delay     = $delay->ioloop(Mojo::IOLoop->new);

Loop object to control, defaults to the global Mojo::IOLoop singleton.

METHODS

Mojo::IOLoop::Delay inherits all methods from Mojo::EventEmitter and implements the following new ones.

begin

my $cb = $delay->begin;

Increment active event counter, the returned callback can be used instead of end. Note that the first argument passed to the callback will be ignored.

my $delay = Mojo::IOLoop->delay;
Mojo::UserAgent->new->get('mojolicio.us' => $delay->begin);
my $tx = $delay->wait;

end

my $remaining = $delay->end;
my $remaining = $delay->end(@args);

Decrement active event counter, all arguments are queued for the finish event and wait method.

wait

my @args = $delay->wait;

Start ioloop and stop it again once the finish event gets emitted, only works when ioloop is not running already.

# Use the "finish" event to synchronize portably
$delay->on(finish => sub {
  my ($delay, @args) = @_;
  ...
});
$delay->wait unless $delay->ioloop->is_running;

SEE ALSO

Mojolicious, Mojolicious::Guides, http://mojolicio.us.