如何解决如何取消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秒。
如果您看到上面的内容,则会看到请求继续。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。