我正在写一个需要发出两个GET请求的Mojolicious模块/控制器;一个接一个地。第二个GET请求取决于第一个GET请求的响应数据。
我希望这两个请求都是非阻塞的。但是,我不能轻易地从第一个非阻塞回调的上下文“返回”为第二个请求提供值。
sub my_controller {
my ($self) = @_;
$self->ua->get($first_endpoint, sub {
# handle response - extract value for second request?
});
my $second_endpoint = 'parameter not available here';
$self->ua->get($second_endpoint, sub {});
}
如果可能,我宁愿不将第二个请求嵌套到第一个回调中?
答案 0 :(得分:1)
首先需要在控制器中调用render_later
方法,因为你编写了非阻塞代码。
存在两种传递数据的方法:
1)
sub action_in_controller {
my $c = shift->render_later;
$c->delay(
sub {
my $delay = shift;
$c->ua->get('http://one.com' => $delay->begin);
},
sub {
my ($delay, $tx) = @_;
$c->ua->post('http://second.com' => $delay->begin);
},
sub {
my ($delay, $tx) = @_;
$c->render(text => 'la-la-la');
}
);
}
2)
sub action_in_controller {
my $c = shift->render_later;
$c->ua->get('http://one.com' => sub {
my ($ua, $tx) = @_;
$c->ua->post('http://second.com' => sub {
my ($ua, $tx) = @_;
$c->render(text => 'la-la-la');
});
});
}
<强> UPD 强>
找到另一种使用Coro调用的变种。
但是在perl 5.22中它不起作用,需要应用patch来修复它。
你还需要编写插件Coro。
Here示例。您只需要ua.pl
和插件Mojolicious::Plugin::Core
。