Snippets

Brian Medley Some promises

Created by Brian Medley
#!/opt/perl
 
use Mojo::Base -strict;
 
use Mojo::UserAgent;
use Mojo::IOLoop;
 
{
    package Mojo::UserAgent::Promises; 
     
    use strict;
    use warnings;
 
    # use Promises qw[deferred];  <-- Kudos
     
    use Mojo::Base 'Mojo::UserAgent';
    use Mojo::Promise;
    use Mojo::Util qw(monkey_patch);
 
    sub start {
        my ($self, $tx) = @_;

        my $promise = Mojo::Promise->new;

        $self->SUPER::start($tx, sub { $promise->resolve($self, $tx) });            

        return $promise;
    }

    for my $name (qw(DELETE GET HEAD OPTIONS PATCH POST PUT)) {
        monkey_patch __PACKAGE__, sprintf("a%s", lc $name), sub {
            my $self = shift;
            
            my $cb = ref $_[-1] eq 'CODE' ? pop : undef;
            
            return $self->start($self->build_tx($name, @_), $cb);
        };
    }
}
 
my $ua = Mojo::UserAgent::Promises->new->max_redirects(4);

my @promises = ();

push(@promises, $ua->aget("http://mojolicio.us")->then(sub {
    my $self = shift;

    say("Yay: " . $_[1]->res->dom->at('title')->text);
})->then(sub {
    say("Next");
}));

push(@promises, $ua->aget("http://slashdot.org")->then(sub {
    my $self = shift;

    say("Skippie: " . $_[1]->res->dom->at('title')->text);
})->then(sub {
    say("Yes");
}));

Mojo::Promise->all(@promises)->then(sub {
    say("Done");

    Mojo::IOLoop->stop;
});

Mojo::IOLoop->start unless Mojo::IOLoop->is_running;

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.