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.

Reply via email to