如何将从get_p返回的承诺分配给变量



我试图从子例程中返回承诺,该子例程包含一些从HTTP请求获得的数据到Web服务器。但是我无法就结果调用then。将其缩小后,似乎不可能将从get_p返回的承诺分配给变量,然后将其用作承诺。

这是一个例子。我本来以为这两个请求完全相同,但只有第二个请求在当时的块中运行代码。

有人可以解释什么区别,如果我想在Sub之外链接更多then方法,我应该如何从子例程中回报承诺?

#!/usr/bin/perl -w
use strict;
use warnings;
use utf8;
use 5.024;
use Data::Dumper;
use Mojo::IOLoop;
use Mojo::UserAgent;
my $promise = Mojo::UserAgent->new->get_p('http://example.com');
$promise->then(sub {
    my $tx = shift;
    warn 'Using variable';
    warn $tx->result->body;
})->wait;
Mojo::UserAgent->new->get_p('http://example.com')
->then(sub {
    my $tx = shift;
    warn 'Not using variable';
    warn $tx->result->body;
})->wait;

当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返回。

最新更新