Also, to stop the recurring timer, save the returned id (you can store it in the delay as well) and then remove it from the loop after a success (for example in the next step).
On Wed, Apr 22, 2015 at 10:14 AM, Dan Book <[email protected]> wrote: > 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.
