NAME
Mojolicious::Plugin::Parallol - Because parallel requests should be as fun as parallololololol!
SYNOPSIS
# Mojolicious
$self->plugin('Parallol');
# Mojolicious::Lite
plugin 'Parallol';
DESCRIPTION
Mojolicious::Plugin::Parallol provides a simple helper for managing several parallel requests in the controller.
HELPERS
Mojolicious::Plugin::Parallol implements the following helpers.
parallol
Parallol optimizes for the common case: You want to call several parallel requests and render the view when they're done.
get '/' => sub {
my $self = shift;
$self->ua->get('http://bbc.co.uk/', $self->parallol(sub {
$self->stash(bbc => pop->res->dom->at('title')->text);
}));
$self->ua->get('http://mojolicio.us/', $self->parallol(sub {
$self->stash(mojo => pop->res->dom->at('title')->text);
}));
};
By wrapping a callback in $self->parallol
you mark the current response as asynchronous (see "render_later" in Mojolicious::Controller) and Parallol will render the view when all callbacks are called.
Automatic stashing
By passing a string to $self->parallol
it will stash the last argument of the result instead. If we rewrite the previous example to use a helper, we can simplify our controller quite a lot.
get '/' => sub {
my $self = shift;
$self->title('http://bbc.co.uk/', $self->parallol('bbc'));
$self->title('http://mojolicio.us/', $self->parallol('mojo'));
};
helpers title => sub {
my ($self, $url, $cb) = @_;
$self->ua->get($url, sub {
$cb->(pop->res->dom->at('title')->text);
});
};
It's recommended that you move as much logic to helpers and other classes/methods so you can take advantage of automatic stashing.
Overriding "done" behavior
When you need to do more than just rendering the view you can override the "done" callback:
get '/' => sub {
my $self = shift;
$self->on_parallol(sub {
shift->render(template => 'something_else');
});
};
$self weakening
In order to prevent memory leaks, Parallol will automatically weaken $self
. This means that if you don't refer to $self
in your callback objects will magically disappear.
# This controller will behave very strangely:
get '/' => sub {
my $self = shift;
my $res = {};
$self->ua->get('http://bbc.co.uk/', $self->parallol(sub {
# There's no reference to $self in this block
$res->{bbc} = pop->res->dom->at('title')->text;
}));
};
In these cases you can disabled weakening by passing in weaken => 0
.
# This controller is fine:
get '/' => sub {
my $self = shift;
my $res = {};
$self->ua->get('http://bbc.co.uk/', $self->parallol(weaken => 0, sub {
# There's no reference to $self in this block
$res->{bbc} = pop->res->dom->at('title')->text;
}));
};
METHODS
Mojolicious::Plugin::Parrallol inherits all methods from Mojolicious::Plugin and implements the following new ones.
register
$plugin->register;
Register helpers in Mojolicious application.
SEE ALSO
AUTHOR
Magnus Holm mailto:magnus@nordaaker.com
LICENSE
This software is licensed under the same terms as Perl itself.