86
J S EVENT LOOP SON LE sontl@designvelop er.com

JavaScript Event Loop

Embed Size (px)

Citation preview

Page 1: JavaScript Event Loop

JS EVENT LOOPSON LE

[email protected]

Page 2: JavaScript Event Loop

HOW DOES

ACTUALLY WORK ?

JS

Page 3: JavaScript Event Loop

HEY ,JSWHAT ARE YOU ?

Page 4: JavaScript Event Loop

I’m aSINGLE-THREADED,

NON-BLOCKING,ASYNCHRONOUS,

CONCURRENTlanguage

Page 5: JavaScript Event Loop

I have a CALL STACK,

an EVENT LOOP,a CALLBACK QUEUE,

some others APIs,and stuffs…

Page 6: JavaScript Event Loop

….

Page 7: JavaScript Event Loop

!!!

Page 8: JavaScript Event Loop

GOOGLE’s V8 JAVASCRIPT RUNTIME ENGINE

Page 9: JavaScript Event Loop

do you have a CALL STACK,

an EVENT LOOP,a CALLBACK QUEUE,

some others APIs,and stuffs ???

HEY ,

Page 10: JavaScript Event Loop

I have a CALL STACK and a

HEAP…

I don’t know what other things are !

Page 11: JavaScript Event Loop

HEAP STACK

Memory Allocation

The Call Stack

main()

printSquare(n)

calcSquare(n)

multiply(n, n)

Page 12: JavaScript Event Loop

HEAP

STACK

main()

printSquare(n)

calcSquare(n)

multiply(n, n)

WEB APIs

DOM (document)

ajax (XMLHTTPRequest)

setTimeout

CALLBACK QUEUE onClick onLoad onDone

EVENT LOOP

Page 13: JavaScript Event Loop

THE CALLSTACK

One thread == One call stack == One thing at a time

main()

printSquare(n)

calcSquare(n)

multiply(n, n)

Page 14: JavaScript Event Loop

function multiply(a, b){return a * b;

}function calcSquare(n){

return multiply(n, n);}function printSquare(n){

var result = calcSquare(n);console.log(result);

}printSquare(4);

THE CALL STACK

Page 15: JavaScript Event Loop

main()

function multiply(a, b){return b * b;

}function calcSquare(n){

return multiply(n, n);}function printSquare(n){

var result = calcSquare(n);console.log(result);

}printSquare(4);

THE CALL STACK

Page 16: JavaScript Event Loop

main()

function multiply(a, b){return b * b;

}function calcSquare(n){

return multiply(n, n);}function printSquare(n){

var result = calcSquare(n);console.log(result);

}printSquare(4);

THE CALL STACK

Page 17: JavaScript Event Loop

main()

function multiply(a, b){return b * b;

}function calcSquare(n){

return multiply(n, n);}function printSquare(n){

var result = calcSquare(n);console.log(result);

}printSquare(4);

THE CALL STACK

Page 18: JavaScript Event Loop

main()

function multiply(a, b){return b * b;

}function calcSquare(n){

return multiply(n, n);}function printSquare(n){

var result = calcSquare(n);console.log(result);

}printSquare(4);

THE CALL STACK

Page 19: JavaScript Event Loop

main()

function multiply(a, b){return b * b;

}function calcSquare(n){

return multiply(n, n);}function printSquare(n){

var result = calcSquare(n);console.log(result);

}printSquare(4);

THE CALL STACK

printSquare(n)

Page 20: JavaScript Event Loop

main()

function multiply(a, b){return b * b;

}function calcSquare(n){

return multiply(n, n);}function printSquare(n){

var result = calcSquare(n);console.log(result);

}printSquare(4);

THE CALL STACK

printSquare(n)

calcSquare(n)

Page 21: JavaScript Event Loop

main()

function multiply(a, b){return b * b;

}function calcSquare(n){

return multiply(n, n);}function printSquare(n){

var result = calcSquare(n);console.log(result);

}printSquare(4);

THE CALL STACK

printSquare(n)

calcSquare(n)

multiply(n, n)

Page 22: JavaScript Event Loop

main()

function multiply(a, b){return b * b;

}function calcSquare(n){

return multiply(n, n);}function printSquare(n){

var result = calcSquare(n);console.log(result);

}printSquare(4);

THE CALL STACK

printSquare(n)

calcSquare(n)

Page 23: JavaScript Event Loop

main()

function multiply(a, b){return b * b;

}function calcSquare(n){

return multiply(n, n);}function printSquare(n){

var result = calcSquare(n);console.log(result);

}printSquare(4);

THE CALL STACK

printSquare(n)

Page 24: JavaScript Event Loop

main()

function multiply(a, b){return b * b;

}function calcSquare(n){

return multiply(n, n);}function printSquare(n){

var result = calcSquare(n);console.log(result);

}printSquare(4);

THE CALL STACK

printSquare(n)

console.log()

Page 25: JavaScript Event Loop

main()

function multiply(a, b){return b * b;

}function calcSquare(n){

return multiply(n, n);}function printSquare(n){

var result = calcSquare(n);console.log(result);

}printSquare(4);

THE CALL STACK

printSquare(n)

Page 26: JavaScript Event Loop

main()

function multiply(a, b){return b * b;

}function calcSquare(n){

return multiply(n, n);}function printSquare(n){

var result = calcSquare(n);console.log(result);

}printSquare(4);

THE CALL STACK

Page 27: JavaScript Event Loop

function multiply(a, b){return b * b;

}function calcSquare(n){

return multiply(n, n);}function printSquare(n){

var result = calcSquare(n);console.log(result);

}printSquare(4);

THE CALL STACK

Page 28: JavaScript Event Loop

function one(){throw new Error(“Oops!”);

}function two(){

one();}function three(){

two();}three();

THE CALL STACK

main()

three(n)

two()

one()

Page 29: JavaScript Event Loop

function stackTrace() {

var err = new Error();return err.stack;

}

HELPFUL WHEN DEBUGGING

Page 30: JavaScript Event Loop

function foo(){return foo();

}

foo();

THE CALL STACK

main()

foo()

Page 31: JavaScript Event Loop

function foo(){return foo();

}

foo();

THE CALL STACK

main()

foo()

foo()

Page 32: JavaScript Event Loop

function foo(){return foo();

}

foo();

THE CALL STACK

main()

foo()

foo()

foo()

Page 33: JavaScript Event Loop

function foo(){return foo();

}

foo();

THE CALL STACK

main()

foo()

foo()

foo()

foo()

Page 34: JavaScript Event Loop

function foo(){return foo();

}

foo();

THE CALL STACK

main()

foo()

foo()

foo()

foo()

foo()

foo()

foo()

Page 35: JavaScript Event Loop

BLOCKINGCode that are slow to run

Page 36: JavaScript Event Loop

BLOCKINGSome examples:- console.log() is not slow

- A loop from 1 to 10,000,000,000 is slow- Network request is slow- Image processing is slow

Page 37: JavaScript Event Loop

var a = $.getSynchronous(“/a”);var b = $.getSynchronous(“/b”);var c = $.getSynchronous(“/c”);

// get data done, now log them out

console.log(a);console.log(b);console.log(c);

THE CALL STACK

main()

Page 38: JavaScript Event Loop

var a = $.getSynchronous(“/a”);var b = $.getSynchronous(“/b”);var c = $.getSynchronous(“/c”);

// get data done, now log them out

console.log(a);console.log(b);console.log(c);

THE CALL STACK

main()

getSynchronous(“/a”)

Page 39: JavaScript Event Loop

var a = $.getSynchronous(“/a”);var b = $.getSynchronous(“/b”);var c = $.getSynchronous(“/c”);

// get data done, now log them out

console.log(a);console.log(b);console.log(c);

THE CALL STACK

main()

getSynchronous(“/b”)

Page 40: JavaScript Event Loop

var a = $.getSynchronous(“/a”);var b = $.getSynchronous(“/b”);var c = $.getSynchronous(“/c”);

// get data done, now log them out

console.log(a);console.log(b);console.log(c);

THE CALL STACK

main()

getSynchronous(“/c”)

Page 41: JavaScript Event Loop

var a = $.getSynchronous(“/a”);var b = $.getSynchronous(“/b”);var c = $.getSynchronous(“/c”);

// get data done, now log them out

console.log(a);console.log(b);console.log(c);

THE CALL STACK

main()

console.log(a)

Page 42: JavaScript Event Loop

var a = $.getSynchronous(“/a”);var b = $.getSynchronous(“/b”);var c = $.getSynchronous(“/c”);

// get data done, now log them out

console.log(a);console.log(b);console.log(c);

THE CALL STACK

main()

console.log(b)

Page 43: JavaScript Event Loop

var a = $.getSynchronous(“/a”);var b = $.getSynchronous(“/b”);var c = $.getSynchronous(“/c”);

// get data done, now log them out

console.log(a);console.log(b);console.log(c);

THE CALL STACK

main()

console.log(c)

Page 44: JavaScript Event Loop

WHY IS THIS A PROBLEM ?Because we runs

code in BROWSERS.See the demo.

Page 45: JavaScript Event Loop

THE SOLUTION ?Asynchronous

callbacks.

Page 46: JavaScript Event Loop

console.log(“Hi”);

setTimeout(function (){console.log(“there”);

}, 5000);

console.log(“Designvelopers”);

Hi

Designvelopers

there

HOW DOES THIS WORK ?THE CODE THE CONSOLE

Page 47: JavaScript Event Loop

console.log(“Hi”);

setTimeout(function (){console.log(“there”);

}, 5000);

console.log(“Designvelopers”);

THE CALL STACK

Page 48: JavaScript Event Loop

console.log(“Hi”);

setTimeout(function (){console.log(“there”);

}, 5000);

console.log(“Designvelopers”);

THE CALL STACK

main()

console.log(“Hi”)

Page 49: JavaScript Event Loop

console.log(“Hi”);

setTimeout(function (){console.log(“there”);

}, 5000);

console.log(“Designvelopers”);

THE CALL STACK

main()

Page 50: JavaScript Event Loop

console.log(“Hi”);

setTimeout(function (){console.log(“there”);

}, 5000);

console.log(“Designvelopers”);

THE CALL STACK

main()

setTimeout(callback)

Page 51: JavaScript Event Loop

console.log(“Hi”);

setTimeout(function (){console.log(“there”);

}, 5000);

console.log(“Designvelopers”);

THE CALL STACK

main()

Page 52: JavaScript Event Loop

console.log(“Hi”);

setTimeout(function (){console.log(“there”);

}, 5000);

console.log(“Designvelopers”);

THE CALL STACK

main()

console.log(“DSV”)

Page 53: JavaScript Event Loop

console.log(“Hi”);

setTimeout(function (){console.log(“there”);

}, 5000);

console.log(“Designvelopers”);

THE CALL STACK

main()

Page 54: JavaScript Event Loop

console.log(“Hi”);

setTimeout(function (){console.log(“there”);

}, 5000);

console.log(“Designvelopers”);

THE CALL STACK

Page 55: JavaScript Event Loop

console.log(“Hi”);

setTimeout(function (){console.log(“there”);

}, 5000);

console.log(“Designvelopers”);

THE CALL STACK

callback

console.log(“there”);

Page 56: JavaScript Event Loop

console.log(“Hi”);

setTimeout(function (){console.log(“there”);

}, 5000);

console.log(“Designvelopers”);

THE CALL STACK

Page 57: JavaScript Event Loop

CONCURRENCY & EVENT LOOPOne thing at a time.Except, not really.

Page 58: JavaScript Event Loop

HEAP

STACK

main()

printSquare(n)

calcSquare(n)

multiply(n, n)

WEB APIs

DOM (document)

ajax (XMLHTTPRequest)

setTimeout

CALLBACK QUEUE onClick onLoad onDone

EVENT LOOP

One thing at a time !

But we still have this !

Page 59: JavaScript Event Loop

console.log(“Hi”);

setTimeout(function (){console.log(“there”);

}, 5000);

console.log(“Designvelopers”);

CALLBACK QUEUE

EVENT LOOP

CODE

CONSOLE

STACK WEB APIs

Page 60: JavaScript Event Loop

console.log(“Hi”);

setTimeout(function (){console.log(“there”);

}, 5000);

console.log(“Designvelopers”);

Hi

CALLBACK QUEUE

EVENT LOOP

CODE

CONSOLE

STACK WEB APIs

main()

console.log(“Hi”)

Page 61: JavaScript Event Loop

console.log(“Hi”);

setTimeout(function (){console.log(“there”);

}, 5000);

console.log(“Designvelopers”);

Hi

CALLBACK QUEUE

EVENT LOOP

CODE

CONSOLE

STACK WEB APIs

main()

setTimeout(callback)

timer

Page 62: JavaScript Event Loop

console.log(“Hi”);

setTimeout(function (){console.log(“there”);

}, 5000);

console.log(“Designvelopers”);

Hi

Designvelopers

CALLBACK QUEUE

EVENT LOOP

CODE

CONSOLE

STACK WEB APIs

main()

setTimeout(callback)

timer

console.log(“DSV”)

Page 63: JavaScript Event Loop

console.log(“Hi”);

setTimeout(function (){console.log(“there”);

}, 5000);

console.log(“Designvelopers”);

Hi

Designvelopers

CALLBACK QUEUE

EVENT LOOP

CODE

CONSOLE

STACK WEB APIs

callback

main()

Page 64: JavaScript Event Loop

console.log(“Hi”);

setTimeout(function (){console.log(“there”);

}, 5000);

console.log(“Designvelopers”);

Hi

Designvelopers

CALLBACK QUEUE

EVENT LOOP

CODE

CONSOLE

STACK WEB APIs

callback

Page 65: JavaScript Event Loop

WHAT DOES DO ?

- It watches the Call Stack and the Callback Queue

- If the Stack is empty, it takes the first element in the Callback Queue, and pushes it into the Stack

EVENT LOOP

Page 66: JavaScript Event Loop

console.log(“Hi”);

setTimeout(function (){console.log(“there”);

}, 5000);

console.log(“Designvelopers”);

Hi

Designvelopers

there

CALLBACK QUEUE

EVENT LOOP

CODE

CONSOLE

STACK WEB APIs

callback

console.log(“there”)

Page 67: JavaScript Event Loop

console.log(“Hi”);

setTimeout(function (){console.log(“there”);

}, 5000);

console.log(“Designvelopers”);

Hi

Designvelopers

there

CALLBACK QUEUE

EVENT LOOP

CODE

CONSOLE

STACK WEB APIs

callback

Page 68: JavaScript Event Loop

console.log(“Hi”);

setTimeout(function (){console.log(“there”);

}, 5000);

console.log(“Designvelopers”);

Hi

Designvelopers

there

CALLBACK QUEUE

EVENT LOOP

CODE

CONSOLE

STACK WEB APIs

Page 69: JavaScript Event Loop

console.log(“Hi”);

setTimeout(function (){console.log(“there”);

}, 5000);

console.log(“Designvelopers”);

Hi

Designvelopers

there

CALLBACK QUEUE

EVENT LOOP

CODE

CONSOLE

STACK WEB APIs

Page 70: JavaScript Event Loop

Beside setTimeout, the other web APIs are (for examples):- DOM manipulation- XHR (XMLHttpRequest)- Etc…

Page 71: JavaScript Event Loop

ANOTHER EXAMPLEs:setTimeout(callback, 0);

Page 72: JavaScript Event Loop

console.log(“Hi”);

setTimeout(function (){console.log(“there”);

}, 0);

console.log(“Designvelopers”);

CALLBACK QUEUE

EVENT LOOP

CODE

CONSOLE

STACK WEB APIs

Page 73: JavaScript Event Loop

console.log(“Hi”);

setTimeout(function (){console.log(“there”);

}, 0);

console.log(“Designvelopers”);

Hi

CALLBACK QUEUE

EVENT LOOP

CODE

CONSOLE

STACK WEB APIs

main()

console.log(“Hi”)

Page 74: JavaScript Event Loop

console.log(“Hi”);

setTimeout(function (){console.log(“there”);

}, 0);

console.log(“Designvelopers”);

Hi

CALLBACK QUEUE

EVENT LOOP

CODE

CONSOLE

STACK WEB APIs

main()

setTimeout(callback)

timer

Page 75: JavaScript Event Loop

console.log(“Hi”);

setTimeout(function (){console.log(“there”);

}, 0);

console.log(“Designvelopers”);

Hi

Designvelopers

CALLBACK QUEUE

EVENT LOOP

CODE

CONSOLE

STACK WEB APIs

main()

setTimeout(callback)

timer

console.log(“DSV”)

Page 76: JavaScript Event Loop

console.log(“Hi”);

setTimeout(function (){console.log(“there”);

}, 0);

console.log(“Designvelopers”);

Hi

Designvelopers

CALLBACK QUEUE

EVENT LOOP

CODE

CONSOLE

STACK WEB APIs

callback

main()

Page 77: JavaScript Event Loop

console.log(“Hi”);

setTimeout(function (){console.log(“there”);

}, 0);

console.log(“Designvelopers”);

Hi

Designvelopers

CALLBACK QUEUE

EVENT LOOP

CODE

CONSOLE

STACK WEB APIs

callback

Page 78: JavaScript Event Loop

console.log(“Hi”);

setTimeout(function (){console.log(“there”);

}, 0);

console.log(“Designvelopers”);

Hi

Designvelopers

there

CALLBACK QUEUE

EVENT LOOP

CODE

CONSOLE

STACK WEB APIs

callback

console.log(“there”)

Page 79: JavaScript Event Loop

console.log(“Hi”);

setTimeout(function (){console.log(“there”);

}, 0);

console.log(“Designvelopers”);

Hi

Designvelopers

there

CALLBACK QUEUE

EVENT LOOP

CODE

CONSOLE

STACK WEB APIs

callback

Page 80: JavaScript Event Loop

console.log(“Hi”);

setTimeout(function (){console.log(“there”);

}, 0);

console.log(“Designvelopers”);

Hi

Designvelopers

there

CALLBACK QUEUE

EVENT LOOP

CODE

CONSOLE

STACK WEB APIs

Page 81: JavaScript Event Loop

console.log(“Hi”);

setTimeout(function (){console.log(“there”);

}, 0);

console.log(“Designvelopers”);

Hi

Designvelopers

there

CALLBACK QUEUE

EVENT LOOP

CODE

CONSOLE

STACK WEB APIs

Page 82: JavaScript Event Loop

DEMOS WITH LOUPE

Page 83: JavaScript Event Loop

ANOTHER EXAMPLEs:- setTimeOut: the minimum time to

execute a function- synchronous vs asynchronous and how this effect the browser

- don’t block the event loop !

Page 84: JavaScript Event Loop

UNDERSTANDINGprocess.nextTick()

IN NODEJSlink

Page 85: JavaScript Event Loop

THE END

Page 86: JavaScript Event Loop

JS EVENT LOOP

SON [email protected]

THANKS FOR WATCHING !