Все активные соединения, созданные объектом UA, закрываются при уничтожении объекта UA.Обещание не ссылается на объект UA, поэтому вы должны убедиться, что объект UA не будет уничтожен.
#!/usr/bin/perl -w
use strict;
use warnings;
use utf8;
use 5.024;
use Mojo::IOLoop;
use Mojo::UserAgent;
my $ua = Mojo::UserAgent->new;
my $promise = $ua->get_p('http://example.com');
$promise->then(sub {
my $tx = shift;
warn 'Using variable';
warn $tx->result->body;
})->wait;
$ua->get_p('http://example.com')
->then(sub {
my $tx = shift;
warn 'Not using variable';
warn $tx->result->body;
})->wait;
Так как Perl использует подсчет ссылок для сборки мусора, нельзя ошибиться, полагая, чтообъекты уничтожаются, как только на них ничего не ссылается.В действительности, объект может выжить до конца утверждения, в котором он не имеет ссылки.(Это побочный эффект механизма, который используется для компенсации того, что ссылки в стеке не учитываются.)
Ваш тест работал, когда вы использовали только один оператор, потому что объект UA сохранился до конца оператора,и поэтому после wait
вернулся.