Snippets

Brian Medley Some promise stuff

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 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 { 
            $DB::single = 1;

            if ($tx->error) {
                $promise->reject($self, $tx);
            }
            else {
                $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 $promise = $ua->aget("https://www.godaddy.com")->then(sub {
    my $self = shift;

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

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("Yo");
}));

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->recurring(1 => sub {
    if ("fulfilled" ne $promise->state) {
        return;
    }

    foreach my $p (@promises) {
        if ("fulfilled" ne $p->state) {
            return;
        }
    }

    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.