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]
> <javascript:>> 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] <javascript:>.
>> To post to this group, send email to [email protected]
>> <javascript:>.
>> 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.