如何将从 get_p 返回的承诺分配给变量?
How to assign promise returned from get_p to a variable?
我试图 return 来自子例程的承诺,其中包含从对 Web 服务器的 HTTP 请求中获得的一些数据。但我无法对结果调用 then
。缩小范围后,似乎无法将 get_p
中的承诺 returned 分配给变量,然后将其用作承诺。
举个例子。本来以为这两个请求是一模一样的,结果只有第二个运行了then块中的代码
有人可以解释一下区别是什么吗?如果我想在子程序外链接更多 then
方法,我应该如何 return 来自子程序的承诺?
#!/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 使用引用计数来进行垃圾回收,因此人们不会错误地认为一旦没有对象引用它们就会被销毁。实际上,对象可以一直存在到它变为未引用的语句结束为止。 (这是一个 side-effect 用于补偿堆栈引用未被计算在内的机制。)
当您只使用一个语句时,您的测试成功了,因为 UA 对象一直存在到语句结束,因此在 wait
返回之后。
我试图 return 来自子例程的承诺,其中包含从对 Web 服务器的 HTTP 请求中获得的一些数据。但我无法对结果调用 then
。缩小范围后,似乎无法将 get_p
中的承诺 returned 分配给变量,然后将其用作承诺。
举个例子。本来以为这两个请求是一模一样的,结果只有第二个运行了then块中的代码
有人可以解释一下区别是什么吗?如果我想在子程序外链接更多 then
方法,我应该如何 return 来自子程序的承诺?
#!/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 使用引用计数来进行垃圾回收,因此人们不会错误地认为一旦没有对象引用它们就会被销毁。实际上,对象可以一直存在到它变为未引用的语句结束为止。 (这是一个 side-effect 用于补偿堆栈引用未被计算在内的机制。)
当您只使用一个语句时,您的测试成功了,因为 UA 对象一直存在到语句结束,因此在 wait
返回之后。