Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number

Re^5: PSGI, Plack, Twiggy, AnyEvent and SockJS... I need help

by Corion (Pope)
on Apr 09, 2014 at 15:41 UTC ( #1081681=note: print w/replies, xml ) Need Help??

in reply to Re^4: PSGI, Plack, Twiggy, AnyEvent and SockJS... I need help
in thread PSGI, Plack, Twiggy, AnyEvent and SockJS... I need help

You need to mention the timer variable $w inside the subroutine to keep it alive.

Either move it into a global variable or just mention it in the subroutine so it closes over the value. Even better would be to clean up the timer based on some condition.

Replies are listed 'Best First'.
Re^6: PSGI, Plack, Twiggy, AnyEvent and SockJS... I need help
by xtpu2 (Acolyte) on Apr 09, 2014 at 17:05 UTC

    So this is the final version of the timer code that works:

    ... my $w_cond = AnyEvent->condvar; $w_cond->cb( sub { warn $_[0]->recv } ); my $w; $w = AnyEvent->timer( after => 0, interval => 5, cb => sub { undef $w if (0); $session->write('5 seconds have passed'); $w_cond->send(); } ); ...

    I changed undef $w; to undef $w if (0);. Now the big question is why does this work, but simply commenting out undef $w; causes the timer to not work? Is there a logical reason here, or is it voodoo? By "voodoo" I mean, code that has to be typed a certain way "just because".

      Now is the moment you want to read about "closures" in Perl. That is why I told you about "mentioning" $w in the subroutine or making $w a global variable.

        Interesting! I didn't quite understand what you meant about "mentioning" the variable first time around. Just now, I replaced undef $w if (0); with $w; and other than a warning about Useless use of private variable in void context, it worked fine. Is there a best practice for how to "mention" variables in this kind of context?

        For now, off to read about closures.

        Edited to add after reading about closures: So basically, the reason I want to mention the variable $w within the callback subroutine is so that the variable becomes part of the lexical scope of the closure? I'm not sure if that's the correct terminology... But basically, unless the variable is somehow being used within the subroutine, it will be destroyed once all the callbacks and event handlers have been set up?

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1081681]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others chilling in the Monastery: (2)
As of 2018-04-23 18:05 GMT
Find Nodes?
    Voting Booth?