我试图从一个子例程返回一个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;
答案 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
。