2016-04-15 18 views
2

Ich schreibe ein Mojolicious-Modul/Controller, die zwei GET-Anforderungen machen müssen; einer nach dem anderen. Die zweite GET-Anforderung hängt von den Antwortdaten von der ersten ab.Mojolicious - zwei non-blocking GET-Anfragen in der gleichen Steuerung

Ich möchte beide Anforderungen nicht blockierend sein. Ich kann jedoch nicht einfach aus dem Kontext des ersten nicht blockierenden Rückrufs "zurückgeben", um Werte für die zweite Anfrage zu liefern.

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 {}); 

} 

Ich würde es vorziehen, die zweite Anfrage nicht in den ersten Rückruf zu verschachteln, wenn möglich?

+1

Wenn die zweite von der ersten abhängt und nicht ausgeführt wird, wenn die erste fehlschlägt, ist die Verschachtelung genau das, was Sie tun müssen. – simbabque

+0

Verschachteln ist die Art und Weise, wie Sie bei nicht blockierenden Anrufen die Reihenfolge von zwei Vorgängen angeben. Warum sollten Sie dies vermeiden? – polettix

Antwort

1

Zuerst müssen Sie die Methode render_later im Controller aufrufen, da Sie nicht blockierenden Code schreiben.

Exist 2 Möglichkeiten, wie die Daten weitergeben müssen:

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

Gefunden eine andere Variante mit Coro aufrufen. Aber in Perl 5.22 funktioniert es nicht und muss patch anwenden, um es zu reparieren. Sie müssen zusätzlich Plugin Coro schreiben. Here Beispiel. Sie benötigen nur ua.pl und das Plugin Mojolicious::Plugin::Core.