Async::Chain - The right way to convert nested callback in plain struct or just the syntax sugar for guy who do not like deep indent.
Version 0.05
Every subroutine in the chain receive callable object as first argument followed by arguments of object call. You can break chain in every sub, just do not call $next.
$next
You can skip some subroutins using skip or jump method.
skip
jump
use Async::Chain; # with chain call chain sub { my next = shift; AnyEvent::HTTP::http_get('http://perldoc.perl.org/', $next); }, sub { my next = shift; return $next->jump('log')->(0, "not a 200 response"); ... $db->async_insert(..., cb => $next); }, sub { my next = shift; ... $next->($status, $message); }, log => sub { my next = shift; my ($status, $message) = @_; ... log(...); };
A asynchronous code often have deep nested callbacks, therefore it is tangled and hard to change. This module help to converta a code like following to some more readable form. Also, with chain you can easily skip some unneeded steps in this thread. For example jump to log step after the first failed query in the chain.
chain
without chain:
sub f { ... some_anync_call @args, cb => sub { ... some_other_anync_call @args, cb => sub { ... ... ... yet_another_anync_call @args, cb => sub { ... } } } }
using chain:
chain sub { my next = shift; ... some_anync_call @args, cb => sub { $next->(@arg) } }, sub { my next = shift; ... some_other_anync_call @args, cb => sub { $next->(@arg) } }, sub { my next = shift; ... }, ... sub { ... yet_another_anync_call @args, cb => sub { $next->(@arg) } }, sub { ... };
If you don't need to skip or hitch links, you can use 'kseq' function from CPS module, that slightly faster.
The Asyn::Chain object constructor. Arguments are list of subroutine optionaly leaded by mark.
Only one exported subroutine. Create and call Anync::Chain object. Return empty list.
Skip one or more subroutine. Skipe one if no argument given. Return Anync::Chain object.
Skip subroutines for first entry of named mark. Return Anync::Chain object.
Move named link to beginning of the chain. When link with given name not exists or first in chain, method has no effect. Return Anync::Chain object.
Anton Reznikov, <anton.n.reznikov at gmail.com>
<anton.n.reznikov at gmail.com>
Please report any bugs or feature requests, or through GitHub web interface at https://github.com/17e/Async-Chain.
You can find documentation for this module with the perldoc command.
perldoc Async::Chain
Mons Anderson - The original idia of chain and it first implementation.
Copyright 2014 Anton Reznikov.
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 dated June, 1991 or at your option any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
A copy of the GNU General Public License is available in the source tree; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
To install Async::Chain, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Async::Chain
CPAN shell
perl -MCPAN -e shell install Async::Chain
For more information on module installation, please visit the detailed CPAN module installation guide.