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.
