首页 > 解决方案 > 如何取消来自 Mojo::UserAgent 的正在进行的请求?

问题描述

假设我想取消一个飞行中的请求Mojo::UserAgent?我怎样才能做到这一点?

标签: perlpromiseuser-agentmojolicious

解决方案


演示如何取消承诺

在这个例子中,我们创建了一个随机的 Timer 承诺和一个 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;

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

返回一个新Mojo::Promise对象,该对象要么在所有传递的Mojo::Promise对象都已实现时实现,要么在其中一个对象拒绝时立即拒绝。如果返回的 Promise 实现了,它会以与传递的 Promise 相同的顺序使用已实现的 Promise 中的值来实现。

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


推荐阅读