Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl Mojolicious-同一控制器中的两个非阻塞GET请求_Perl_Mojolicious - Fatal编程技术网

Perl Mojolicious-同一控制器中的两个非阻塞GET请求

Perl Mojolicious-同一控制器中的两个非阻塞GET请求,perl,mojolicious,Perl,Mojolicious,我正在编写一个mojolicous模块/控制器,它需要发出两个GET请求;一个接一个。第二个GET请求取决于第一个GET请求的响应数据 我希望两个请求都是非阻塞的。然而,我不能轻易地从第一个非阻塞回调的上下文“返回”以向第二个请求提供值 sub my_controller { my ($self) = @_; $self->ua->get($first_endpoint, sub { # handle response - extract valu

我正在编写一个mojolicous模块/控制器,它需要发出两个GET请求;一个接一个。第二个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 {}); 

}

如果可能的话,我不希望将第二个请求嵌套到第一个回调中?

首先需要调用controller中的
render\u
方法,因为您编写的是非阻塞代码

存在两种传递数据的方法:

(一)

(二)

控制器中的子动作{
my$c=shift->render\u稍后;
$c->ua->gethttp://one.com'=>sub{
我的($ua,$tx)=@;
$c->ua->post($c)http://second.com'=>sub{
我的($ua,$tx)=@;
$c->render(text=>la');
});
});
}
UPD

找到了使用Coro调用的另一个变体。 但在Perl5.22中,它不起作用,需要应用来修复它。 您还需要编写插件Coro。
例子。您只需要
ua.pl
和plugin
Mojolicious::plugin::Core

如果第二个依赖于第一个,并且如果第一个失败就不会执行,嵌套正是您需要做的。嵌套是处理非阻塞调用时指定两个操作顺序的方式,您为什么要避免它?
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');
    }
  );
}