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