You need to save the return value of $delay->begin, that returns a callback
that you need to call in order to proceed to the next step, like in the
timer example you were looking at before.

On Wed, Apr 22, 2015 at 3:10 AM, hammondos <[email protected]> wrote:

> Ok so I've adapted the script to use the delay helper, and based on the
> documentation it seems like this should work, but still can't seem to exit
> from the recurring loop.
>
> Feels like the placement of $delay->begin is wrong or I'm not using the
> right signal to say the recurring loop should be stopped - return doesn't
> seem right but have also tried $loop->stop & $loop->reset with no luck. Any
> ideas?
>
> $self->delay(
>     sub {
>         my $delay = shift;
>         $delay->begin;
>         Mojo::IOLoop->recurring(
>             1 => sub {
>                 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}});
>                     $delay->data(rows => $rows);
>                     return;
>                 }
>             }
>         );
>     },
>     sub {
>         my $delay = shift;
>         $self->render(json => $delay->data('rows'));
>     }
> );
>
>
>
> On Tuesday, 21 April 2015 22:17:35 UTC+1, hammondos wrote:
>>
>> Ok cool, thanks for pointing me in the right direction
>>
>> On Tuesday, 21 April 2015 22:10:36 UTC+1, Dan Book wrote:
>>>
>>> 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.
>

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