鈍足ランナーのIT日記

走るのが好きな5流のITエンジニアのブログ。

趣味の範囲は広いけど、どれも中途半端なクソブロガー楽しめるWebアプリを作ってあっと言わせたい。サーバーサイドPerl(Mojolicious)、クライアントサイドVue.js。Arduinoにも触手を伸ばす予定。

Mojoliciousで並列WebAPIアクセスした結果を待ち合わせて処理する

とりあえずこんなんで、どうでしょう?

package Test::Web::Example;
use Mojo::Base 'Mojolicious::Controller';
use Mojo::IOLoop::ForkCall;

# This action will render a template
sub welcome {
  my $self = shift;

  my @results;

  $self->render_later();

  my $delay = Mojo::IOLoop->delay(sub { 
    my ($delay, @args) = @_;
    $self->stash(result => "@results");
    $self->render();
  });

  for my $i (1 .. 10) {
    my $end = $delay->begin;
    my $fc = Mojo::IOLoop::ForkCall->new;
    $fc->run(
        sub {
          # Web API Access code here !
          sleep 1;
          return "$i";
        },
        sub {
          my ($fc, $err, $msg) = @_;
          push @results, $msg;
          warn "$msg";
          $end->();
        }
    );
  }
  $delay->wait;

}

1;