This is gold:
*"You need to use the same event loop for the promise as for the items that
will resolve it"*
Thanks Dan!
The posted action is just for demo my problem. I actually want to use a
loop to do something like:
# inside a timer callback
my $more_jobs = 1;
while ($more_jobs) {
$get_job->()
->then( $run_job )
->catch( sub { $more_jobs = 0 } )
->wait;
}
On Thursday, March 15, 2018 at 12:35:16 PM UTC+8, Dan Book wrote:
>
> 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] <javascript:>
> > 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]
>> <javascript:>> 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] <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.