如何取消Mojo :: UserAgent的运行中请求?

问题描述

假设我要取消Mojo::UserAgent的机上请求?我该怎么办?

解决方法

关于如何取消承诺的说明

在此示例中,我们创建一个随机的Timer承诺和一个HTTP Get承诺。第一个赢得rejects另一个承诺的人。

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;

请注意,如果超时获胜,您可能会遇到Premature connection close的错误事件,这正是您所期望的。您可以在这里看到我们正在使用Mojo::Promise's all

返回一个新的Mojo::Promise对象,该对象在所有传递的Mojo::Promise对象都满足时被满足,或者在其中一个对象被拒绝后立即被拒绝。 ,它会以已实现的承诺中的值与传递的承诺相同的顺序来实现。

请注意,在这种情况下,race可能更适用。我们不必手动拒绝其他承诺,但我想用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秒。

如果您看到上面的内容,则会看到请求继续。