But to add, there's usually no reason to make it this complicated; if you just use the main event loop, and do your rendering in a ->then chained off the promise, you don't need to wait for it; it will render the page when the promise resolves.
On Thu, Mar 15, 2018 at 12:34 AM, Dan Book <[email protected]> wrote: > You need to use the same event loop for the promise as for the items that > will resolve it. So for instance in your example you need to do: > > my $loop = Mojo::IOLoop->new; > my $promise = Mojo::Promise->new(ioloop => $loop); > $loop->timer(...); > return $promise; > > On Wed, Mar 14, 2018 at 11:34 PM, Michael Fung <[email protected]> > wrote: > >> Hi Dan, >> >> It does not work, perhaps I misunderstood you. >> >> Here is my action for test: >> >> sub boom { >> my ($c) = @_; >> my @output; >> >> >> my $timer = sub { >> #~ my $promise = Mojo::Promise->new; >> my $promise = Mojo::Promise->new(ioloop => Mojo::IOLoop->new); >> Mojo::IOLoop->timer( 2 => sub { >> $promise->resolve(); >> }); >> return $promise; >> }; >> >> >> $timer->() >> ->then( sub { >> warn "Boom!"; >> push @output, "Boom!"; >> } ) >> ->wait; >> >> push @output, "-the end- \n"; >> >> >> $c->render(text => join(",", @output) ); >> } >> >> >> >> No matter which Mojo::Promise->new statement I use, the result is the >> same: I only get "-the end-" without "Boom!". >> >> >> On Thursday, March 15, 2018 at 12:21:12 AM UTC+8, Dan Book wrote: >>> >>> ->wait will not block if the event loop is currently running, like if >>> you are setting this up in an event loop callback like a request handler. >>> In order to cause promises to block while running the main event loop, you >>> need to run the promises in a separate event loop. >>> >>> my $promise = Mojo::Promise->new(ioloop => Mojo::IOLoop->new); >>> >>> On Wed, Mar 14, 2018 at 10:06 AM, Michael Fung <[email protected]> >>> wrote: >>> >>>> Thanks Andre. I already have the "return $promise" statement to end the >>>> sub, so it is not the cause. >>>> >>>> I really suppose the construct will work like the recv function of >>>> AnyEvent->condvar. >>>> >>>> >>>> On Wednesday, March 14, 2018 at 9:11:53 PM UTC+8, Andre Parker wrote: >>>>> >>>>> Hi. >>>>> >>>>> You should return promise object in get_data sub. Something like: >>>>> >>>>> my $get_data = sub { >>>>> my $promise = Mojo::Promise->new(); >>>>> # Some code that resolves promise >>>>> ... >>>>> return $promise; >>>>> }; >>>>> >>>>> On Wednesday, 14 March 2018 12:18:07 UTC+2, Michael Fung wrote: >>>>>> >>>>>> Hi all, >>>>>> >>>>>> I have the following construct using Mojo::Promise: >>>>>> >>>>>> my $get_data = sub { >>>>>> create new Promise object; >>>>>> read data from database >>>>>> if data read ok { >>>>>> $promise->resolve($data); >>>>>> } else { >>>>>> $promise->reject('no data'); >>>>>> } >>>>>> }; >>>>>> >>>>>> >>>>>> $get_data->() >>>>>> ->then( sub { >>>>>> # do something with data >>>>>> ... >>>>>> }) >>>>>> ->catch( sub { >>>>>> # log error >>>>>> ... >>>>>> }) >>>>>> ->wait; >>>>>> >>>>>> say "the end"; >>>>>> >>>>>> However, I got *"the end*" before running the "do something with >>>>>> data" block or catch block. Is there any way to make ->wait really wait? >>>>>> >>>>>> >>>>>> Thanks, >>>>>> Michael >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> -- >>>> 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 https://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 https://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 https://groups.google.com/group/mojolicious. For more options, visit https://groups.google.com/d/optout.
