如何将从get_p返回的Promise分配给变量?

时间:2019-05-20 15:43:23

标签: perl promise mojolicious mojo-useragent

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

这是一个例子。我本以为两个请求完全相同,但是只有第二个请求在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;

1 个答案:

答案 0 :(得分:4)

销毁UA对象时,将关闭UA对象创建的所有活动连接。 Promise没有引用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