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.

Reply via email to