Understanding Javascript asynchronous setInterval in canvas -


the following code creates canvas ball @ centre when init() method invoked using setinterval. when keydown() event fired ball moves on x , y axis (depending on key user has pressed). struggle understand happens when key pressed.

does setinterval stop when key pressed update key value (keyleft, keyright, etc) , resumes , takes updated values consideration

or

does code inside key event execute while setinterval in progress?

i 've read setinterval asynchronous while key events synchronous , since javascript single threaded second option can't true, right? use knowledge on one..

    <canvas id="canvas" style="border: 1px solid black" width="400" height="400"></canvas>     <script type="text/javascript" src="jquery.js"></script>     <script type="text/javascript">         var ball = {             positionx: 200,             positiony: 200,             keyleft: false,             keyright: false,             keyup: false,             keydown: false,             init: function() {                 this.canvas = document.getelementbyid('canvas');                 this.ctx = this.canvas.getcontext('2d');                 setinterval(ball.draw, 10);             },             circle: function (x, y, fill) {                 this.ctx.beginpath();                 this.ctx.arc(x, y, 20, 0, math.pi * 2, false);                 if (fill) {                     this.ctx.fill();                 } else {                     this.ctx.stroke();                 }             },             draw: function() {                 ball.ctx.clearrect(0, 0, 400, 400);                 if (ball.keyleft) ball.positionx -= 5;                 else if (ball.keyright) ball.positionx += 5;                 if (ball.keyup) ball.positiony -= 5;                 else if (ball.keydown) ball.positiony += 5;                 ball.circle(ball.positionx, ball.positiony, true);             }         }         ball.init();          $('body').keydown(function (e) {             var key = e.keycode;             if (key == 37) {                 ball.keyleft = true;             } else if (key == 39) {                 ball.keyright = true;             }              if (key == 38) {                 ball.keyup = true;             } else if (key == 40) {                 ball.keydown = true;             }         });     </script> 

javascript (in browsers) event-driven language. of time, nothing being executed. when event occurs , script has registered listener particular type of event, event placed queue. if part of script being executed, not interrupted - rather, when completes, browser pull next event queue , start executing registered handler it.

in code, registering 2 kinds of events: timer events (implicitly, using setinterval) , keydown events (explicitly, using jquery, uses addeventlistener). when timer event fires, ball.draw method executed. if keydown event arrives while running, waits in queue until ball.draw finishes. dispatched handler function assigned. , vice versa: if keydown handler in progress, 10 milliseconds pass, , timer event occurs, timer event has wait until keydown handler completes. 1 reason why javascript timers inherently imprecise.

short version: keydown handler can execute in between executions of ball.draw. changes makes variables used both functions visible ball.draw on next invocation.


Comments

Popular posts from this blog

c++ - Delete matches in OpenCV (Keypoints and descriptors) -

java - Could not locate OpenAL library -

sorting - opencl Bitonic sort with 64 bits keys -