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 <dbook@cpan.org>

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