Skip to content

Instantly share code, notes, and snippets.

@kraih
Created April 25, 2014 03:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save kraih/11276761 to your computer and use it in GitHub Desktop.
Save kraih/11276761 to your computer and use it in GitHub Desktop.
use Mojo::Base -strict;
use Devel::Cycle;
use Mojo::UserAgent;
use Promises 'deferred';
my $ua = Mojo::UserAgent->new;
sub fetch_it {
my $url = shift;
my $d = deferred();
$ua->get(
$url => sub {
my ($ua, $tx) = @_;
$d->resolve($tx);
}
);
return $d;
}
my $promise1 = fetch_it('mojolicio.us');
my $promise2 = $promise1->then(sub {
my $tx = shift;
say $tx->res->code;
fetch_it('mojolicio.us');
});
$promise2->then(sub {
my $tx = shift;
say $tx->res->code;
Mojo::IOLoop->stop;
});
find_cycle $ua;
Mojo::IOLoop->start;
# $ perl leaking_promises.pl
# Cycle (1):
# $Mojo::UserAgent::A->{'connections'} => \%B
# $B->{'92724e8de92d121700aa39b721792a89'} => \%C
# $C->{'cb'} => \&D
# $D variable $d => \$E
# $$E => \%Promises::Deferred::F
# $Promises::Deferred::F->{'rejected'} => \@G
# $G->[0] => \&H
# $H variable $d => \$I
# $$I => \%Promises::Deferred::J
# $Promises::Deferred::J->{'rejected'} => \@K
# $K->[0] => \&L
# $L variable $self => \$M
# $$M => \%Promises::Deferred::J
#
# Cycle (2):
# $Mojo::UserAgent::A->{'connections'} => \%B
# $B->{'92724e8de92d121700aa39b721792a89'} => \%C
# $C->{'cb'} => \&D
# $D variable $d => \$E
# $$E => \%Promises::Deferred::F
# $Promises::Deferred::F->{'rejected'} => \@G
# $G->[0] => \&H
# $H variable $self => \$N
# $$N => \%Promises::Deferred::F
#
# Cycle (3):
# $Mojo::UserAgent::A->{'connections'} => \%B
# $B->{'92724e8de92d121700aa39b721792a89'} => \%C
# $C->{'cb'} => \&D
# $D variable $d => \$E
# $$E => \%Promises::Deferred::F
# $Promises::Deferred::F->{'resolved'} => \@O
# $O->[0] => \&P
# $P variable $d => \$Q
# $$Q => \%Promises::Deferred::J
# $Promises::Deferred::J->{'rejected'} => \@K
# $K->[0] => \&L
# $L variable $self => \$M
# $$M => \%Promises::Deferred::J
#
# 200
# 200
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment