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

时间:2016-04-15 14:17:02

标签: perl mojolicious

我正在写一个需要发出两个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 {}); 

}

如果可能,我宁愿不将第二个请求嵌套到第一个回调中?

1 个答案:

答案 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