Perl 如何取消来自Mojo::UserAgent的飞行中请求?

Perl 如何取消来自Mojo::UserAgent的飞行中请求?,perl,promise,user-agent,mojolicious,Perl,Promise,User Agent,Mojolicious,比方说我想取消一个飞行中的请求?我该怎么做?演示如何取消承诺 在本例中,我们创建了一个随机计时器承诺和一个HTTP Get承诺。第一个赢得另一个承诺的人 use Mojo::UserAgent; use v5.30; use experimental 'signatures'; my $ua = Mojo::UserAgent->new; my $p1 = Mojo::Promise->timer(rand('0.4') , 'Timeout'); my $p2 = $ua->

比方说我想取消一个飞行中的请求?我该怎么做?

演示如何取消承诺 在本例中,我们创建了一个随机计时器承诺和一个HTTP Get承诺。第一个赢得另一个承诺的人

use Mojo::UserAgent;
use v5.30;
use experimental 'signatures';

my $ua = Mojo::UserAgent->new;
my $p1 = Mojo::Promise->timer(rand('0.4') , 'Timeout');
my $p2 = $ua->get_p('https://www.cpanel.net/is_hiring_message_evan_carroll_on_linkedin');

$p1
  ->then(sub ($res) {$p2->reject("\t> reject \$p2"); say $res})
  ->catch(sub ($msg) {say $msg});
$p2
  ->then(sub ($res) {$p1->reject("\t> reject \$p1"); say $res})
  ->catch(sub ($msg) {say $msg});

Mojo::Promise->new->all( $p1, $p2 )->catch(sub{})->wait;
注意:如果超时成功,您可能会收到一个错误事件,原因是
过早关闭连接
,这正是您所期望的。你可以在这里看到‘我们正在利用’

返回一个新的
Mojo::Promise
对象,该对象在所有传递的
Mojo::Promise
对象都已满足时满足,或者在其中一个对象拒绝时立即拒绝。如果返回的承诺满足,则使用满足的承诺中的值按照与传递的承诺相同的顺序满足


注意,在这种情况下可能更适用。我们不必手动拒绝另一个承诺,但我想用
reject
手动演示在抽象中拒绝。

这实际上不起作用

考虑以下几点:

use Mojo::UserAgent;
use v5.26;
use experimental 'signatures';

my $ua = Mojo::UserAgent->new;
my $p1 = Mojo::Promise->timer(0.004, 'Timeout');
my $p2 = $ua->get_p('http://www.cpanel.net/is_hiring_message_evan_carroll_on_linkedin');

$p1
  ->then(sub ($res) {$p2->reject("\t> reject \$p2"); say $res})
  ->catch(sub ($msg) {say $msg});
$p2
  ->then(sub ($res) {$p1->reject("\t> reject \$p1"); say $res})
  ->catch(sub ($msg) {say $msg});

Mojo::Promise->new->all( $p1, $p2 )->catch(sub{})->wait;

Mojo::Promise->timer(2)->wait();
这里的更改是放弃SSL,总是在0.004秒后超时,并让事件循环额外等待2秒


如果您仔细阅读以上内容,您将看到请求仍在继续。

我认为这一点非常有用,您可能需要解释飞行中在这种情况下的含义。我不知道它是什么,我对问题标题的第一个想法是“这将是可怕的”。@simbabque:在这种情况下,“飞行中”意味着一个尚未完成的HTTP请求。