gpt4 book ai didi

perl - 如何将从 get_p 返回的 promise 分配给变量?

转载 作者:行者123 更新时间:2023-12-05 00:45:44 24 4
gpt4 key购买 nike

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

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

有人可以解释一下有什么区别吗,如果我想链接更多 then 我应该如何从子例程返回一个 promise 子外的方法?

#!/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 对象创建的所有事件连接都将关闭。 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 之后。回来。

关于perl - 如何将从 get_p 返回的 promise 分配给变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56224240/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com