Skip to content

Instantly share code, notes, and snippets.

@jberger
Created October 12, 2018 19:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jberger/4af98b3154f184e6a71717ee84825111 to your computer and use it in GitHub Desktop.
Save jberger/4af98b3154f184e6a71717ee84825111 to your computer and use it in GitHub Desktop.
use Mojo::Base -strict;
use Mojo::Util 'dumper';
use Mojo::Promise;
use Mojo::EventEmitter;
use Mojo::IOLoop;
sub promise_from_event {
my ($emitter, $success, $error) = @_;
my $p = Mojo::Promise->new;
my %subs;
my $cb = sub {
my ($method, $emitter, @args) = @_;
$emitter->unsubscribe($_ => $subs{$_}) for keys %subs;
$p->$method(@args);
};
$subs{$success} = $emitter->on($success => sub { $cb->(resolve => @_) });
$subs{$error} = $emitter->on($error => sub { $cb->(reject => @_) }) if $error;
return $p;
}
## Usage
my $bus = Mojo::EventEmitter->new;
my $p = promise_from_event($bus, 'connect', 'error');
my $diag = sub {
say shift;
print dumper [@_];
print dumper [$bus->subscribers('connect'), $bus->subscribers('error')];
Mojo::IOLoop->stop;
};
$p->then(sub{ $diag->(resolved => @_) }, sub { $diag->(rejected => @_) });
#Mojo::IOLoop->next_tick(sub { $bus->emit(connect => 1) });
Mojo::IOLoop->next_tick(sub { $bus->emit('error' => 'argh') });
Mojo::IOLoop->start;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment