【问题标题】:How to assign promise returned from get_p to a variable?如何将从 get_p 返回的承诺分配给变量?
【发布时间】:2019-05-20 15:43:22
【问题描述】:

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

这是一个例子。我原以为这两个请求完全一样,但只有第二个运行了 then 块中的代码。

如果我想在子程序之外链接更多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;

【问题讨论】:

    标签: perl promise mojolicious mojo-useragent


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2015-12-13
      • 1970-01-01
      • 2017-11-28
      • 2020-04-30
      • 2016-02-28
      • 2020-05-10
      • 2018-08-30
      • 2015-06-27
      • 2019-09-18
      相关资源
      最近更新 更多