Sort of. You want the delay helper here:
https://metacpan.org/pod/Mojolicious::Plugin::DefaultHelpers#delay

That creates a Mojo::IOLoop delay as well, but also does all the things I
described before relevant to rendering. You won't be able to do a recurring
timer exactly the same way, as you can't set up begin() callbacks in
advance since you don't know how many there will be. You will want to just
create a recurring timer in the first step, get the callback from
$delay->begin, and you can have that call $end->() to proceed to the next
step when you get a success.

On Tue, Apr 21, 2015 at 4:58 PM, hammondos <[email protected]> wrote:

> Great, thanks - so something like the code example from here
> <http://mojolicio.us/perldoc/Mojo/IOLoop#delay>? Not sure how to replace
> the timer with recurring logic though
>
> # Synchronize multiple eventsmy $delay = Mojo::IOLoop->delay(sub { say 
> 'BOOM!' });for my $i (1 .. 10) {
>   my $end = $delay->begin;
>   Mojo::IOLoop->timer($i => sub {
>     say 10 - $i;
>     $end->();
>   });}
> $delay->wait;
>
>
>
>
> On Tuesday, 21 April 2015 21:41:48 UTC+1, Dan Book wrote:
>>
>> The finish event of the controller is not really appropriate here. It
>> will not fire until the transaction is finished, which doesn't happen until
>> you render a response. So once a success happens you want to call something
>> that will render a response from there. You probably want to use the delay
>> helper which will turn off automatic rendering, keep a reference to the
>> transaction, and handle exceptions.
>>
>> On Tue, Apr 21, 2015 at 3:39 PM, hammondos <[email protected]> wrote:
>>
>>> Hi,
>>>
>>> I'm trying to run an AJAX call that needs to check an external API queue
>>> for a response every second, then generate a chart based on that data using
>>> JSON.
>>>
>>> The code sample from the module I'm using to connect to the API suggests
>>> using a for...sleep loop, however clearly this doesn't work with
>>> Mojolicious.
>>>
>>> I've tried several different permutations of using a recurring loop with
>>> varying degrees of success, but just can't get it to work - latest example
>>> below. This example never exits, even when there is data returned.
>>>
>>> I'm aware that the $success parameter is probably not helping the
>>> situation, but would really appreciate any guidance on where to go next to
>>> stop the loop once a successful response has been received, and render a
>>> JSON response.
>>>
>>> my $success = 0;
>>> my $id = Mojo::IOLoop->recurring(
>>>     1 => sub {
>>>         $self->finish if $success == 1;
>>>         if (my $results = $sc_api->check_queue($report_id)) {
>>>             my $rows = $sc_api->process_os($results);
>>>             $log->info(Dumper($rows));
>>>             &_insert_data({domain => $domain, path => $path, data => {os
>>> => $rows}});
>>>             $success = 1;
>>>          }
>>>     }
>>> );
>>>
>>> # need to wait
>>> $self->on(finish => sub {
>>>     # remove ioloop
>>>     Mojo::IOLoop->remove($id);
>>>
>>>     my $db = $self->db;
>>>     my $analytics = $db->get_collection('analytics');
>>>     my $rows = $analytics->find({id => $url});
>>>     my $doc = $rows->next;
>>>     $self->render(json => $doc->{'analytics'}->{'os'});
>>> });
>>>
>>>
>>>  --
>>> You received this message because you are subscribed to the Google
>>> Groups "Mojolicious" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to [email protected].
>>> To post to this group, send email to [email protected].
>>> Visit this group at http://groups.google.com/group/mojolicious.
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>>  --
> You received this message because you are subscribed to the Google Groups
> "Mojolicious" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/mojolicious.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Mojolicious" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/mojolicious.
For more options, visit https://groups.google.com/d/optout.

Reply via email to