NAME

   Mojo::Promise::Role::Futurify - Chain a Future from a Mojo::Promise

SYNOPSIS

     use Mojo::Promise;

     my $promise = Mojo::Promise->with_roles('+Futurify')->new;
     my $future = $promise->futurify->on_ready(sub {
       my $f = shift;
       say $f->is_done ? 'Done' : 'Failed';
     });
     $promise->ioloop->timer(5 => sub { $promise->resolve });
     $future->await;

     use Mojo::UserAgent;
     my $ua = Mojo::UserAgent->new;

     # complicated way of doing $ua->get('https://example.com')
     my $tx = $ua->get_p('https://example.com')->with_roles('+Futurify')->futurify->get;

     # using Future composition methods
     my @futures;
     foreach my $url (@urls) {
       push @futures, $ua->get_p($url)->with_roles('+Futurify')->futurify;
     }

     use Future;
     Future->wait_all(@futures)->then(sub {
       foreach my $f (@_) {
         if ($f->is_done) {
           my $tx = $f->get;
         } elsif ($f->is_failed) {
           my $err = $f->failure;
         }
       }
     })->await;

     # using Future::Utils in a Mojolicious application
     use Mojolicious::Lite;
     use Future::Utils 'fmap_concat';
     my $ua = Mojo::UserAgent->new;

     get '/foo' => sub {
       my $c = shift;
       my $count = $c->param('count') // 50;

       my $f = fmap_concat {
         $ua->get_p('https://example.com')->with_roles('+Futurify')->futurify;
       } foreach => [1..$count], concurrent => 10;

       my $tx = $c->render_later->tx;
       $f->on_done(sub {
         my @txs = @_;
         $c->render(json => [titles => map { $_->res->dom->at('title')->text } @txs]);
       })->on_fail(sub {
         $c->reply->exception(@_);
       })->on_ready(sub { undef $tx })->retain;
     };

     app->start;

DESCRIPTION

   Mojo::Promise::Role::Futurify provides an interface to chain Future
   objects from Mojo::Promise objects.

METHODS

   Mojo::Promise::Role::Futurify composes the following methods.

futurify

     my $future = $promise->futurify;

   Returns a Future::Mojo object that will become ready with success or
   failure when the Mojo::Promise resolves or rejects.

BUGS

   Report any issues on the public bugtracker.

AUTHOR

   Dan Book <[email protected]>

COPYRIGHT AND LICENSE

   This software is Copyright (c) 2017 by Dan Book.

   This is free software, licensed under:

     The Artistic License 2.0 (GPL Compatible)

SEE ALSO

   Mojo::Promise, Future, Future::Mojo