SlideShare a Scribd company logo
Globalcode – Open4education
JavaScript Event Loop
JavaScript
Recap
single threaded
non-blocking
asynchronous
concurrent
runtime
call stack
event loop
callback queue
vendor APIs
Globalcode – Open4education
Heap
Memory Available
Task Queue
listOnTimeout
listOnTimeout
listOnTimeout
listOnTimeout
listOnTimeout
Delayed Tasks
Call Stack
write()
saveFile()
updateTime()
tryOnTimeout
listOnTimeout
Execution Contexts
Vendor APIs (Node, Web, GJS)
Runtime and Platform Abstraction
Event Loop
Task Scheduler
Globalcode – Open4education
Heap
Memory Available
Task Queue
listOnTimeout
listOnTimeout
listOnTimeout
listOnTimeout
listOnTimeout
Delayed Tasks
Call Stack
write()
saveFile()
updateTime()
tryOnTimeout
listOnTimeout
Execution Contexts
Vendor APIs (Node, Web, GJS)
Runtime and Platform Abstraction
Event Loop
Task Scheduler
VENDOR
DEPENDENT
VENDOR
DEPENDENT
ECM
A262
VENDOR
DEPENDENT
ECM
A262
OVERLAP
VENDOR
DEPENDENT
ECM
A262
OVERLAP
Globalcode – Open4education
call stack ∙ task queue ∙ event loop ∙ vendor APIs
Vendor Dependent
Vendor APIs
JavaScript has many
implementations
Spidermonkey
JavaScriptCore
ChakraCore

V8
XS
Web
Node
GJS
Johnny Five
Demo
Web
var tID = setTimeout(callback, [delay[, ...args]])
var tID = setTimeout(callback, [delay])
var tID = setTimeout(code[, delay])
var iID = setInterval(func, delay[, ...args])
var iID = setInterval(code, delay)
clearTimeout(tID)
clearTimeout(iID)
https://www.w3.org/standards/webdesign/script
Node
var timeout = setTimeout(callback, [delay, [...args]])
var interval = setInterval(callback, [delay, [...args]])
var immediate = setImmediate(callback[, ...args])
clearTimeout(timeout)
clearInterval(interval)
clearImmediate(immediate)
https://nodejs.org/dist/latest-v10.x/docs/api/
Node
console.log('start');
process.nextTick(() => {
console.log('nextTick callback');
});
console.log('scheduled');
https://nodejs.org/dist/latest-v10.x/docs/api/
GJS
const { mainloop } = imports
mainloop.timeout_add(1, () => log(“Hello World”))
mainloop.timeout_add(1, mainloop.quit)


mainloop.run()
GJSdocs scattered around modules
Johnny Five
// Blink an LED
var five = require("johnny-five")
var board = new five.Board()
board.on("ready", function() {
var led = new five.Led(13)
led.blink()
});
http://johnny-five.io/api/led/#usage
http://johnny-five.io/api/
Globalcode – Open4education
call stack ∙ task queue ∙ event loop ∙ vendor APIs
ECMA 8.4 Jobs and Job Queues & ECMA 8.6 RunJobs()
Call Stack
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply = (a, b) => a * b
const square = (number) => multiply(number, number)
const prints = (number) => console.log(square(number))



prints()
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply = (a, b) => a * b
const square = (number) => multiply(number, number)
const prints = (number) => console.log(square(number))



prints()
main
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply = (a, b) => a * b
const square = (number) => multiply(number, number)
const prints = (number) => console.log(square(number))



prints()
prints
main
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply = (a, b) => a * b
const square = (number) => multiply(number, number)
const prints = (number) => console.log(square(number))



prints()
prints
main
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply = (a, b) => a * b
const square = (number) => multiply(number, number)
const prints = (number) => console.log(square(number))



prints()
prints
main
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply = (a, b) => a * b
const square = (number) => multiply(number, number)
const prints = (number) => console.log(square(number))



prints()
square
prints
main
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply = (a, b) => a * b
const square = (number) => multiply(number, number)
const prints = (number) => console.log(square(number))



prints()
square
prints
main
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply = (a, b) => a * b
const square = (number) => multiply(number, number)
const prints = (number) => console.log(square(number))



prints()
multiply
square
prints
main
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply = (a, b) => a * b
const square = (number) => multiply(number, number)
const prints = (number) => console.log(square(number))



prints()
multiply
square
prints
main
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply = (a, b) => a * b
const square = (number) => multiply(number, number)
const prints = (number) => console.log(square(number))



prints()
multiply
square
prints
main
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply = (a, b) => a * b
const square = (number) => multiply(number, number)
const prints = (number) => console.log(square(number))



prints()
square
prints
main
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply = (a, b) => a * b
const square = (number) => multiply(number, number)
const prints = (number) => console.log(square(number))



prints()
square
prints
main
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply = (a, b) => a * b
const square = (number) => multiply(number, number)
const prints = (number) => console.log(square(number))



prints()
prints
main
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply = (a, b) => a * b
const square = (number) => multiply(number, number)
const prints = (number) => console.log(square(number))



prints()
console.log
prints
main
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply = (a, b) => a * b
const square = (number) => multiply(number, number)
const prints = (number) => console.log(square(number))



prints()
prints
main
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply = (a, b) => a * b
const square = (number) => multiply(number, number)
const prints = (number) => console.log(square(number))



prints()
main
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply = (a, b) => a * b
const square = (number) => multiply(number, number)
const prints = (number) => console.log(square(number))



prints()
Globalcode – Open4education
call stack ∙ task queue ∙ event loop ∙ vendor APIs
And some of Event Loop
Task Queue
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
main
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
setTimeout
main
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
listOnTimeout, 2000
setTimeout
main
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
main
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
listOnTimeout, 2000
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
listOnTimeout, 2000
Globalcode – Open4education
call stack ∙ task queue ∙ event loop ∙ vendor APIs
Vendor Dependent & Partially described in ECMA
Event Loops
An infinite loop
while (queue.waitForMessage()) {
queue.processNextMessage();
}
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
listOnTimeout, 2000
tryOnTimeout
listOnTimeout
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
prints
tryOnTimeout
listOnTimeout
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
prints
tryOnTimeout
listOnTimeout
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
prints
tryOnTimeout
listOnTimeout
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
prints
tryOnTimeout
listOnTimeout
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
square
prints
tryOnTimeout
listOnTimeout
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
square
prints
tryOnTimeout
listOnTimeout
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
multiply
square
prints
tryOnTimeout
listOnTimeout
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
square
prints
tryOnTimeout
listOnTimeout
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
square
prints
tryOnTimeout
listOnTimeout
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
prints
tryOnTimeout
listOnTimeout
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
prints
tryOnTimeout
listOnTimeout
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
prints
tryOnTimeout
listOnTimeout
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
console.log
prints
tryOnTimeout
listOnTimeout
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
tryOnTimeout
listOnTimeout
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
tryOnTimeout
listOnTimeout
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
listOnTimeout
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
const multiply (a, b) => a * b
const square (number) => multiply(number, number)
const prints (number) => console.log(square(number))
setTimeout(prints, 2000)
So that’s it for event
loops, right?
The loop dequeues an
event, dispatches the
callback…
And setTimeout and
setInterval adds
callbacks to queue…
And every tick the loop
consumes an item from
the queue…
Then
You notice this:
Promise case
console.log('script start');


new Promise(resolve => {
resolve();
console.log('executor');
})
.then(() => console.log('then');


console.log('script end');
script start
script end
then

executor
B
A C
D
script start
then

executor

script end
script start
script end
executor
then
script start
then

executor

script end
script start
then

executor

script end
script start
script end
then

executor
B
A C
script start
script end
executor
then
D
script start
then

executor

script end
Surprise!
Promise resolution
enqueues a task!
And then someday
Browser console
console.log('script start');
setTimeout(() => console.log('setTimeout'), 0);
requestAnimationFrame(() =>
console.log('requestAnimationFrame'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
script start
script end
setTimeout
promise1
promise2
script start
script end
promise1
promise2
setTimeout
B
A C
script start
setTimeout
promise1
promise2
script end
D
script start
promise1
promise2
setTimeout

script end
script start
script end

setTimeout
promise1
promise2
script start
script end
promise1
promise2
setTimeout
B
A C
script start
setTimeout
promise1
promise2
script end
D
script start
setTimeout
promise1
promise2

script end
ECMA says nothing*
about event loops
*Looks for specs*
*Tries to grasp why*
HTML Event Loop
html.spec.whatwg.org/multipage/
webappapis.html#event-loops
HTML specification
defines additional
event queues
As part of the W3C
HTML standard
Globalcode – Open4education
Heap
Memory Available
Macrotask Queue
listOnTimeout
listOnTimeout
Delayed Tasks
Call Stack
write()
saveFile()
updateTime()
tryOnTimeout
listOnTimeout
Execution Contexts
Web API
Runtime and Platform Abstraction
Event Loop
Task Scheduler
Microtask Queue
promiseReactionJob
promiseReactionJob
After the end of each
macrotask, drain the
microtask queue
https://html.spec.whatwg.org/multipage/webappapis.html#event-loop-processing-model
Promise &
MutationObserver
callbacks
https://html.spec.whatwg.org/multipage/webappapis.html#event-loop-processing-model
Other relevant queues
looks like microtask’s
https://html.spec.whatwg.org/multipage/webappapis.html#event-loop-processing-model
Paint
Window Resize
Media Queries
Intersections
Microtask Render Update
Checkpoint
Scroll Steps Pending targets
Animation Frame Callback list
Fullscreen Pending events
Animations Pending targets
Macrotask
Loop
Every tick is made of
these steps
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
main
Macrotask
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
main
Macrotask
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
console.log
main
Macrotask
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
setTimeout
main
Macrotask
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
setTimeout
main
timeout1
Macrotask
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
requestAnimationFrame
main
timeout1
Macrotask
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
requestAnimationFrame
main
timeout1
reqAnimFrm1
Macrotask
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
Promise.resolve
main
timeout1
reqAnimFrm1
Macrotask
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
Promise.then
main
timeout1
reqAnimFrm1
promise1
Macrotask
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
Promise.then
main
timeout1
reqAnimFrm1
promise1
promise2
Macrotask
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
console.log
main
timeout1
reqAnimFrm1
promise1
promise2
Macrotask
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
main
timeout1
reqAnimFrm1
promise1
promise2
Macrotask
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
timeout1
reqAnimFrm1
promise1
promise2
Macrotask
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
timeout1
reqAnimFrm1
promise1
promise2
Microtask
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
timeout1
reqAnimFrm1
promise2
Microtask
<anonymous>
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
timeout1
reqAnimFrm1
promise2
Microtask
console.log
<anonymous>
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
timeout1
reqAnimFrm1
promise2
Microtask
<anonymous>
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
timeout1
reqAnimFrm1
promise2
Microtask
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
timeout1
reqAnimFrm1
Microtask
<anonymous>
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
timeout1
reqAnimFrm1
Microtask
console.log
<anonymous>
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
timeout1
reqAnimFrm1
Microtask
<anonymous>
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
timeout1
reqAnimFrm1
Render Update
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
timeout1
reqAnimFrm1
Render Update
Window Resize
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
timeout1
reqAnimFrm1
Render Update
Scroll Steps
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
timeout1
reqAnimFrm1
Render Update
Media Queries
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
timeout1
reqAnimFrm1
Render Update
Animations
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
timeout1
reqAnimFrm1
Render Update
Fullscreen
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
timeout1
reqAnimFrm1
Render Update
Animation Frame
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
timeout1
Render Update
Animation Frame
<anonymous>
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
timeout1
Render Update
Animation Frame
console.log
<anonymous>
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
timeout1
Render Update
Animation Frame
<anonymous>
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
timeout1
Render Update
Animation Frame
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
timeout1
Render Update
Intersections
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
timeout1
Render Update
Paint
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
Macrotask
timeout1
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
Macrotask
<anonymous>
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
console.log
<anonymous>
Macrotask
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
Macrotask
<anonymous>
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
Macrotask
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
Microtask
Globalcode – Open4education
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start');
setTimeout(() => console.log('timeout1'), 0);
requestAnimationFrame(() => console.log('reqAnimFrm1'));
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end');
Macrotask Queue
Microtask Queue
Animation Frame
Render Update
Node.js console
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
script start
script end
nextTick
promise1
promise2
setTimeout
setImmediate
script start
script end
promise1
promise2
nextTick
setTimeout
setImmediate
B
A C
script start
script end
promise1
promise2
setTimeout
setImmediate
nextTick
D
script start
script end
promise1
promise2
setImmediate
setTimeout
nextTick
Node.js console
setTimeout(() => {

console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);

}, 0);
script start
script end
nextTick
promise1
promise2
setTimeout
setImmediate
script start
script end
nextTick
promise1
promise2
setImmediate
setTimeout
B
A
script start
script end
nextTick
promise1
promise2
setTimeout
setImmediate
script start
script end
nextTick
promise1
promise2
setImmediate
setTimeout
B
A
Looks like Node.js has
some strangeness
happening
It happens that
NAMES
Node.js Event Loop
https://nodejs.org/en/docs/guides/
event-loop-timers-and-nexttick/
Globalcode – Open4education
Heap
Memory AvailableDelayed Tasks
Call Stack
write()
saveFile()
updateTime()
tryOnTimeout
listOnTimeout
Execution Contexts
Node.js API
Runtime and Platform Abstraction
Event Loop
Task Scheduler
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
Task Queues
The queues are
consumed in order,
top-down
nextTick → microTask
nextTick → microTask
nextTick → microTask
nextTick → microTask
nextTick → microTask
nextTick → microTask
Globalcode – Open4education
Pending Callbacks
Idle, Prepare
Timers
Poll
Check
Close Callbacks
Checks timers that expired
and call their callbacks
Exhaust the pending queue:
Delivers system error callbacks
such as ECONNREFUSED
Node.js internal
Exhausts poll queue: Delivers
callbacks for file reads, socket
listening, incoming connections
Exhausts "immediate" queue:
Delivers callbacks for
setImmediate calls
Exhausts this callbacks queue:
Delivers callbacks for
socket close & destroy, errors
setInterval, setTimeout
server.listen

socket.on('data')

fs.readFile
setImmediate
socket.close()
socket.destroy()
Checkpoint
Repeat
socket.on('error')
nextTick → microTask
nextTick → microTask
nextTick → microTask
nextTick → microTask
nextTick → microTask
nextTick → microTask
Globalcode – Open4education
Pending Callbacks
Idle, Prepare
Timers
Poll
Check
Close Callbacks
Checks timers that expired
and call their callbacks
Exhaust the pending queue:
Delivers system error callbacks
such as ECONNREFUSED
Node.js internal
Exhausts poll queue: Delivers
callbacks for file reads, socket
listening, incoming connections
Exhausts "immediate" queue:
Delivers callbacks for
setImmediate calls
Exhausts this callbacks queue:
Delivers callbacks for
socket close & destroy, errors
setInterval, setTimeout
server.listen

socket.on('data')

fs.readFile
setImmediate
socket.close()
socket.destroy()
Checkpoint
Repeat
socket.on('error')
Node.js console
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
main
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
console.log
main
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
setTimeout
main
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
setTimeout
main
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
process.nextTick
main
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
process.nextTick
main
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
setImmediate
main
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
setImmediate
main
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
Promise.resolve
main
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
Promise.then
main
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
Promise.then
main
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
Promise.then
main
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
Promise.then
main
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
console.log
main
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
main
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
<anonymous>
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
console.log
<anonymous>
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
<anonymous>
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
<anonymous>
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
console.log
<anonymous>
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
<anonymous>
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
<anonymous>
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
console.log
<anonymous>
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
<anonymous>
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
<anonymous>
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
console.log
<anonymous>
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
<anonymous>
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
<anonymous>
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
console.log
<anonymous>
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
<anonymous>
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
Globalcode – Open4education
Task Queue
Delayed Tasks
Call Stack
Execution Contexts
Event Loop
Task Scheduler
console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
nextTick microTask
Node.js console
setTimeout(() => {

console.log('script start’);
setTimeout(() => console.log('setTimeout'), 0);
process.nextTick(() => console.log(‘nextTick'));
setImmediate(() => console.log('setImmediate'), 0);
Promise.resolve()
.then(() => console.log('promise1'))
.then(() => console.log('promise2'));
console.log('script end’);

}, 0);
script start
script end
nextTick
promise1
promise2
setTimeout
setImmediate
script start
script end
nextTick
promise1
promise2
setImmediate
setTimeout
B
A
script start
script end
nextTick
promise1
promise2
setTimeout
setImmediate
script start
script end
nextTick
promise1
promise2
setImmediate
setTimeout
B
A
Recap
That diagram is an
oversimplification
Globalcode – Open4education
Heap
Memory Available
Task Queue
listOnTimeout
listOnTimeout
listOnTimeout
listOnTimeout
listOnTimeout
Delayed Tasks
Call Stack
write()
saveFile()
updateTime()
tryOnTimeout
listOnTimeout
Execution Contexts
Vendor APIs (Node, Web, GJS)
Runtime and Platform Abstraction
Event Loop
Task Scheduler
Stuff ends up being like
this on the Web
Globalcode – Open4education
Heap
Memory Available
Macrotask Queue
listOnTimeout
listOnTimeout
Delayed Tasks
Call Stack
write()
saveFile()
updateTime()
tryOnTimeout
listOnTimeout
Execution Contexts
Web API
Runtime and Platform Abstraction
Event Loop
Task Scheduler
Microtask Queue
promiseReactionJob
promiseReactionJob
And like this in Node.js
Globalcode – Open4education
Heap
Memory AvailableDelayed Tasks
Call Stack
write()
saveFile()
updateTime()
tryOnTimeout
listOnTimeout
Execution Contexts
Node.js API
Runtime and Platform Abstraction
Event Loop
Task Scheduler
Timers
Pending Callbacks
Idle, Prepare
Poll
Check
Close Callbacks
Task Queues
So check runtime’s
documentation
JavaScript is popular on
Node.js and Web
But you can use it
everywhere
You can build your own
event loop tied to your
needs
That’s all folks
Thanks
Have a great event!

More Related Content

What's hot

Java 8 date & time api
Java 8 date & time apiJava 8 date & time api
Java 8 date & time api
Rasheed Waraich
 
Analysing in depth work manager
Analysing in depth work managerAnalysing in depth work manager
Analysing in depth work manager
bhatnagar.gaurav83
 
Kotlin - scope functions and collections
Kotlin - scope functions and collectionsKotlin - scope functions and collections
Kotlin - scope functions and collections
Wei-Shen Lu
 
KMM survival guide: how to tackle struggles between Kotlin and Swift
KMM survival guide: how to tackle struggles between Kotlin and SwiftKMM survival guide: how to tackle struggles between Kotlin and Swift
KMM survival guide: how to tackle struggles between Kotlin and Swift
Commit University
 
Concurrency in Golang
Concurrency in GolangConcurrency in Golang
Concurrency in Golang
Oliver N
 
Le Wagon - Web 101
Le Wagon - Web 101Le Wagon - Web 101
Le Wagon - Web 101
Edward_Schults
 
Java 8 lambda expressions
Java 8 lambda expressionsJava 8 lambda expressions
Java 8 lambda expressions
Logan Chien
 
Git & GitHub for Beginners
Git & GitHub for BeginnersGit & GitHub for Beginners
Git & GitHub for Beginners
Sébastien Saunier
 
Regular Expression (Regex) Fundamentals
Regular Expression (Regex) FundamentalsRegular Expression (Regex) Fundamentals
Regular Expression (Regex) Fundamentals
Mesut Günes
 
Le Wagon - Javascript for Beginners
Le Wagon - Javascript for BeginnersLe Wagon - Javascript for Beginners
Le Wagon - Javascript for Beginners
Sébastien Saunier
 
Tester unitairement une application java
Tester unitairement une application javaTester unitairement une application java
Tester unitairement une application java
Antoine Rey
 
Understanding the nodejs event loop
Understanding the nodejs event loopUnderstanding the nodejs event loop
Understanding the nodejs event loop
Saurabh Kumar
 
Les collections en Java
Les collections en JavaLes collections en Java
Les collections en Java
Papa Cheikh Cisse
 
HTTP HOST header attacks
HTTP HOST header attacksHTTP HOST header attacks
HTTP HOST header attacks
DefconRussia
 
Node.js Tutorial for Beginners | Node.js Web Application Tutorial | Node.js T...
Node.js Tutorial for Beginners | Node.js Web Application Tutorial | Node.js T...Node.js Tutorial for Beginners | Node.js Web Application Tutorial | Node.js T...
Node.js Tutorial for Beginners | Node.js Web Application Tutorial | Node.js T...
Edureka!
 
Techical Workflow for a Startup
Techical Workflow for a StartupTechical Workflow for a Startup
Techical Workflow for a Startup
Sébastien Saunier
 
Le Wagon - 2h Landing
Le Wagon - 2h LandingLe Wagon - 2h Landing
Le Wagon - 2h Landing
Boris Paillard
 
Java Threads and Concurrency
Java Threads and ConcurrencyJava Threads and Concurrency
Java Threads and Concurrency
Sunil OS
 
[C++ Korea] Effective Modern C++ Study, Item 11 - 13
[C++ Korea] Effective Modern C++ Study, Item 11 - 13[C++ Korea] Effective Modern C++ Study, Item 11 - 13
[C++ Korea] Effective Modern C++ Study, Item 11 - 13
Chris Ohk
 
Job Queue in Golang
Job Queue in GolangJob Queue in Golang
Job Queue in Golang
Bo-Yi Wu
 

What's hot (20)

Java 8 date & time api
Java 8 date & time apiJava 8 date & time api
Java 8 date & time api
 
Analysing in depth work manager
Analysing in depth work managerAnalysing in depth work manager
Analysing in depth work manager
 
Kotlin - scope functions and collections
Kotlin - scope functions and collectionsKotlin - scope functions and collections
Kotlin - scope functions and collections
 
KMM survival guide: how to tackle struggles between Kotlin and Swift
KMM survival guide: how to tackle struggles between Kotlin and SwiftKMM survival guide: how to tackle struggles between Kotlin and Swift
KMM survival guide: how to tackle struggles between Kotlin and Swift
 
Concurrency in Golang
Concurrency in GolangConcurrency in Golang
Concurrency in Golang
 
Le Wagon - Web 101
Le Wagon - Web 101Le Wagon - Web 101
Le Wagon - Web 101
 
Java 8 lambda expressions
Java 8 lambda expressionsJava 8 lambda expressions
Java 8 lambda expressions
 
Git & GitHub for Beginners
Git & GitHub for BeginnersGit & GitHub for Beginners
Git & GitHub for Beginners
 
Regular Expression (Regex) Fundamentals
Regular Expression (Regex) FundamentalsRegular Expression (Regex) Fundamentals
Regular Expression (Regex) Fundamentals
 
Le Wagon - Javascript for Beginners
Le Wagon - Javascript for BeginnersLe Wagon - Javascript for Beginners
Le Wagon - Javascript for Beginners
 
Tester unitairement une application java
Tester unitairement une application javaTester unitairement une application java
Tester unitairement une application java
 
Understanding the nodejs event loop
Understanding the nodejs event loopUnderstanding the nodejs event loop
Understanding the nodejs event loop
 
Les collections en Java
Les collections en JavaLes collections en Java
Les collections en Java
 
HTTP HOST header attacks
HTTP HOST header attacksHTTP HOST header attacks
HTTP HOST header attacks
 
Node.js Tutorial for Beginners | Node.js Web Application Tutorial | Node.js T...
Node.js Tutorial for Beginners | Node.js Web Application Tutorial | Node.js T...Node.js Tutorial for Beginners | Node.js Web Application Tutorial | Node.js T...
Node.js Tutorial for Beginners | Node.js Web Application Tutorial | Node.js T...
 
Techical Workflow for a Startup
Techical Workflow for a StartupTechical Workflow for a Startup
Techical Workflow for a Startup
 
Le Wagon - 2h Landing
Le Wagon - 2h LandingLe Wagon - 2h Landing
Le Wagon - 2h Landing
 
Java Threads and Concurrency
Java Threads and ConcurrencyJava Threads and Concurrency
Java Threads and Concurrency
 
[C++ Korea] Effective Modern C++ Study, Item 11 - 13
[C++ Korea] Effective Modern C++ Study, Item 11 - 13[C++ Korea] Effective Modern C++ Study, Item 11 - 13
[C++ Korea] Effective Modern C++ Study, Item 11 - 13
 
Job Queue in Golang
Job Queue in GolangJob Queue in Golang
Job Queue in Golang
 

Similar to [JS EXPERIENCE 2018] Javascript Event Loop além do setInterval - Derek Stavis

The Nuts and Bolts of Kafka Streams---An Architectural Deep Dive
The Nuts and Bolts of Kafka Streams---An Architectural Deep DiveThe Nuts and Bolts of Kafka Streams---An Architectural Deep Dive
The Nuts and Bolts of Kafka Streams---An Architectural Deep Dive
HostedbyConfluent
 
Refactoring to Macros with Clojure
Refactoring to Macros with ClojureRefactoring to Macros with Clojure
Refactoring to Macros with ClojureDmitry Buzdin
 
2019-01-29 - Demystifying Kotlin Coroutines
2019-01-29 - Demystifying Kotlin Coroutines2019-01-29 - Demystifying Kotlin Coroutines
2019-01-29 - Demystifying Kotlin Coroutines
Eamonn Boyle
 
Workshop "Can my .NET application use less CPU / RAM?", Yevhen Tatarynov
Workshop "Can my .NET application use less CPU / RAM?", Yevhen TatarynovWorkshop "Can my .NET application use less CPU / RAM?", Yevhen Tatarynov
Workshop "Can my .NET application use less CPU / RAM?", Yevhen Tatarynov
Fwdays
 
GE8151 Problem Solving and Python Programming
GE8151 Problem Solving and Python ProgrammingGE8151 Problem Solving and Python Programming
GE8151 Problem Solving and Python Programming
Muthu Vinayagam
 
Coding in GO - GDG SL - NSBM
Coding in GO - GDG SL - NSBMCoding in GO - GDG SL - NSBM
Coding in GO - GDG SL - NSBM
Raveen Perera
 
Golang勉強会
Golang勉強会Golang勉強会
Golang勉強会
Shin Sekaryo
 
mobl - model-driven engineering lecture
mobl - model-driven engineering lecturemobl - model-driven engineering lecture
mobl - model-driven engineering lecturezefhemel
 
FPBrno 2018-05-22: Benchmarking in elixir
FPBrno 2018-05-22: Benchmarking in elixirFPBrno 2018-05-22: Benchmarking in elixir
FPBrno 2018-05-22: Benchmarking in elixir
Functional Programming Brno
 
Yevhen Tatarynov "From POC to High-Performance .NET applications"
Yevhen Tatarynov "From POC to High-Performance .NET applications"Yevhen Tatarynov "From POC to High-Performance .NET applications"
Yevhen Tatarynov "From POC to High-Performance .NET applications"
LogeekNightUkraine
 
A gentle introduction to functional programming through music and clojure
A gentle introduction to functional programming through music and clojureA gentle introduction to functional programming through music and clojure
A gentle introduction to functional programming through music and clojure
Paul Lam
 
Big Data Day LA 2016/ Hadoop/ Spark/ Kafka track - Data Provenance Support in...
Big Data Day LA 2016/ Hadoop/ Spark/ Kafka track - Data Provenance Support in...Big Data Day LA 2016/ Hadoop/ Spark/ Kafka track - Data Provenance Support in...
Big Data Day LA 2016/ Hadoop/ Spark/ Kafka track - Data Provenance Support in...
Data Con LA
 
Introduction to Scalding and Monoids
Introduction to Scalding and MonoidsIntroduction to Scalding and Monoids
Introduction to Scalding and Monoids
Hugo Gävert
 
Think Async: Asynchronous Patterns in NodeJS
Think Async: Asynchronous Patterns in NodeJSThink Async: Asynchronous Patterns in NodeJS
Think Async: Asynchronous Patterns in NodeJS
Adam L Barrett
 
Go ahead, make my day
Go ahead, make my dayGo ahead, make my day
Go ahead, make my day
Tor Ivry
 
Modern technologies in data science
Modern technologies in data science Modern technologies in data science
Modern technologies in data science
Chucheng Hsieh
 
sonam Kumari python.ppt
sonam Kumari python.pptsonam Kumari python.ppt
sonam Kumari python.ppt
ssuserd64918
 
The Ring programming language version 1.4 book - Part 7 of 30
The Ring programming language version 1.4 book - Part 7 of 30The Ring programming language version 1.4 book - Part 7 of 30
The Ring programming language version 1.4 book - Part 7 of 30
Mahmoud Samir Fayed
 
The Ring programming language version 1.5.3 book - Part 189 of 194
The Ring programming language version 1.5.3 book - Part 189 of 194The Ring programming language version 1.5.3 book - Part 189 of 194
The Ring programming language version 1.5.3 book - Part 189 of 194
Mahmoud Samir Fayed
 
Something about Golang
Something about GolangSomething about Golang
Something about Golang
Anton Arhipov
 

Similar to [JS EXPERIENCE 2018] Javascript Event Loop além do setInterval - Derek Stavis (20)

The Nuts and Bolts of Kafka Streams---An Architectural Deep Dive
The Nuts and Bolts of Kafka Streams---An Architectural Deep DiveThe Nuts and Bolts of Kafka Streams---An Architectural Deep Dive
The Nuts and Bolts of Kafka Streams---An Architectural Deep Dive
 
Refactoring to Macros with Clojure
Refactoring to Macros with ClojureRefactoring to Macros with Clojure
Refactoring to Macros with Clojure
 
2019-01-29 - Demystifying Kotlin Coroutines
2019-01-29 - Demystifying Kotlin Coroutines2019-01-29 - Demystifying Kotlin Coroutines
2019-01-29 - Demystifying Kotlin Coroutines
 
Workshop "Can my .NET application use less CPU / RAM?", Yevhen Tatarynov
Workshop "Can my .NET application use less CPU / RAM?", Yevhen TatarynovWorkshop "Can my .NET application use less CPU / RAM?", Yevhen Tatarynov
Workshop "Can my .NET application use less CPU / RAM?", Yevhen Tatarynov
 
GE8151 Problem Solving and Python Programming
GE8151 Problem Solving and Python ProgrammingGE8151 Problem Solving and Python Programming
GE8151 Problem Solving and Python Programming
 
Coding in GO - GDG SL - NSBM
Coding in GO - GDG SL - NSBMCoding in GO - GDG SL - NSBM
Coding in GO - GDG SL - NSBM
 
Golang勉強会
Golang勉強会Golang勉強会
Golang勉強会
 
mobl - model-driven engineering lecture
mobl - model-driven engineering lecturemobl - model-driven engineering lecture
mobl - model-driven engineering lecture
 
FPBrno 2018-05-22: Benchmarking in elixir
FPBrno 2018-05-22: Benchmarking in elixirFPBrno 2018-05-22: Benchmarking in elixir
FPBrno 2018-05-22: Benchmarking in elixir
 
Yevhen Tatarynov "From POC to High-Performance .NET applications"
Yevhen Tatarynov "From POC to High-Performance .NET applications"Yevhen Tatarynov "From POC to High-Performance .NET applications"
Yevhen Tatarynov "From POC to High-Performance .NET applications"
 
A gentle introduction to functional programming through music and clojure
A gentle introduction to functional programming through music and clojureA gentle introduction to functional programming through music and clojure
A gentle introduction to functional programming through music and clojure
 
Big Data Day LA 2016/ Hadoop/ Spark/ Kafka track - Data Provenance Support in...
Big Data Day LA 2016/ Hadoop/ Spark/ Kafka track - Data Provenance Support in...Big Data Day LA 2016/ Hadoop/ Spark/ Kafka track - Data Provenance Support in...
Big Data Day LA 2016/ Hadoop/ Spark/ Kafka track - Data Provenance Support in...
 
Introduction to Scalding and Monoids
Introduction to Scalding and MonoidsIntroduction to Scalding and Monoids
Introduction to Scalding and Monoids
 
Think Async: Asynchronous Patterns in NodeJS
Think Async: Asynchronous Patterns in NodeJSThink Async: Asynchronous Patterns in NodeJS
Think Async: Asynchronous Patterns in NodeJS
 
Go ahead, make my day
Go ahead, make my dayGo ahead, make my day
Go ahead, make my day
 
Modern technologies in data science
Modern technologies in data science Modern technologies in data science
Modern technologies in data science
 
sonam Kumari python.ppt
sonam Kumari python.pptsonam Kumari python.ppt
sonam Kumari python.ppt
 
The Ring programming language version 1.4 book - Part 7 of 30
The Ring programming language version 1.4 book - Part 7 of 30The Ring programming language version 1.4 book - Part 7 of 30
The Ring programming language version 1.4 book - Part 7 of 30
 
The Ring programming language version 1.5.3 book - Part 189 of 194
The Ring programming language version 1.5.3 book - Part 189 of 194The Ring programming language version 1.5.3 book - Part 189 of 194
The Ring programming language version 1.5.3 book - Part 189 of 194
 
Something about Golang
Something about GolangSomething about Golang
Something about Golang
 

More from iMasters

O que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
O que você precisa saber para modelar bancos de dados NoSQL - Dani MonteiroO que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
O que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
iMasters
 
Postgres: wanted, beloved or dreaded? - Fabio Telles
Postgres: wanted, beloved or dreaded? - Fabio TellesPostgres: wanted, beloved or dreaded? - Fabio Telles
Postgres: wanted, beloved or dreaded? - Fabio Telles
iMasters
 
Por que minha query esta lenta? - Suellen Moraes
Por que minha query esta lenta? - Suellen MoraesPor que minha query esta lenta? - Suellen Moraes
Por que minha query esta lenta? - Suellen Moraes
iMasters
 
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
iMasters
 
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalvesORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
iMasters
 
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
iMasters
 
Arquitetando seus dados na prática para a LGPD - Alessandra Martins
Arquitetando seus dados na prática para a LGPD - Alessandra MartinsArquitetando seus dados na prática para a LGPD - Alessandra Martins
Arquitetando seus dados na prática para a LGPD - Alessandra Martins
iMasters
 
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
iMasters
 
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana ChahoudDesenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
iMasters
 
Use MDD e faça as máquinas trabalharem para você - Andreza Leite
 Use MDD e faça as máquinas trabalharem para você - Andreza Leite Use MDD e faça as máquinas trabalharem para você - Andreza Leite
Use MDD e faça as máquinas trabalharem para você - Andreza Leite
iMasters
 
Entendendo os porquês do seu servidor - Talita Bernardes
Entendendo os porquês do seu servidor - Talita BernardesEntendendo os porquês do seu servidor - Talita Bernardes
Entendendo os porquês do seu servidor - Talita Bernardes
iMasters
 
Backend performático além do "coloca mais máquina lá" - Diana Arnos
Backend performático além do "coloca mais máquina lá" - Diana ArnosBackend performático além do "coloca mais máquina lá" - Diana Arnos
Backend performático além do "coloca mais máquina lá" - Diana Arnos
iMasters
 
Dicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato GroffeDicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato Groffe
iMasters
 
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
iMasters
 
Quem se importa com acessibilidade Web? - Mauricio Maujor
Quem se importa com acessibilidade Web? - Mauricio MaujorQuem se importa com acessibilidade Web? - Mauricio Maujor
Quem se importa com acessibilidade Web? - Mauricio Maujor
iMasters
 
Service Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Service Mesh com Istio e Kubernetes - Wellington Figueira da SilvaService Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Service Mesh com Istio e Kubernetes - Wellington Figueira da Silva
iMasters
 
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto PascuttiErros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
iMasters
 
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...
Elasticidade e engenharia de banco de dados para alta performance  - Rubens G...Elasticidade e engenharia de banco de dados para alta performance  - Rubens G...
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...
iMasters
 
Construindo aplicações mais confiantes - Carolina Karklis
Construindo aplicações mais confiantes - Carolina KarklisConstruindo aplicações mais confiantes - Carolina Karklis
Construindo aplicações mais confiantes - Carolina Karklis
iMasters
 
Monitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe RegalgoMonitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe Regalgo
iMasters
 

More from iMasters (20)

O que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
O que você precisa saber para modelar bancos de dados NoSQL - Dani MonteiroO que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
O que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
 
Postgres: wanted, beloved or dreaded? - Fabio Telles
Postgres: wanted, beloved or dreaded? - Fabio TellesPostgres: wanted, beloved or dreaded? - Fabio Telles
Postgres: wanted, beloved or dreaded? - Fabio Telles
 
Por que minha query esta lenta? - Suellen Moraes
Por que minha query esta lenta? - Suellen MoraesPor que minha query esta lenta? - Suellen Moraes
Por que minha query esta lenta? - Suellen Moraes
 
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
 
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalvesORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
 
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
 
Arquitetando seus dados na prática para a LGPD - Alessandra Martins
Arquitetando seus dados na prática para a LGPD - Alessandra MartinsArquitetando seus dados na prática para a LGPD - Alessandra Martins
Arquitetando seus dados na prática para a LGPD - Alessandra Martins
 
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
 
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana ChahoudDesenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
 
Use MDD e faça as máquinas trabalharem para você - Andreza Leite
 Use MDD e faça as máquinas trabalharem para você - Andreza Leite Use MDD e faça as máquinas trabalharem para você - Andreza Leite
Use MDD e faça as máquinas trabalharem para você - Andreza Leite
 
Entendendo os porquês do seu servidor - Talita Bernardes
Entendendo os porquês do seu servidor - Talita BernardesEntendendo os porquês do seu servidor - Talita Bernardes
Entendendo os porquês do seu servidor - Talita Bernardes
 
Backend performático além do "coloca mais máquina lá" - Diana Arnos
Backend performático além do "coloca mais máquina lá" - Diana ArnosBackend performático além do "coloca mais máquina lá" - Diana Arnos
Backend performático além do "coloca mais máquina lá" - Diana Arnos
 
Dicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato GroffeDicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato Groffe
 
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
 
Quem se importa com acessibilidade Web? - Mauricio Maujor
Quem se importa com acessibilidade Web? - Mauricio MaujorQuem se importa com acessibilidade Web? - Mauricio Maujor
Quem se importa com acessibilidade Web? - Mauricio Maujor
 
Service Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Service Mesh com Istio e Kubernetes - Wellington Figueira da SilvaService Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Service Mesh com Istio e Kubernetes - Wellington Figueira da Silva
 
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto PascuttiErros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
 
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...
Elasticidade e engenharia de banco de dados para alta performance  - Rubens G...Elasticidade e engenharia de banco de dados para alta performance  - Rubens G...
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...
 
Construindo aplicações mais confiantes - Carolina Karklis
Construindo aplicações mais confiantes - Carolina KarklisConstruindo aplicações mais confiantes - Carolina Karklis
Construindo aplicações mais confiantes - Carolina Karklis
 
Monitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe RegalgoMonitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe Regalgo
 

Recently uploaded

Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
BookNet Canada
 
A tale of scale & speed: How the US Navy is enabling software delivery from l...
A tale of scale & speed: How the US Navy is enabling software delivery from l...A tale of scale & speed: How the US Navy is enabling software delivery from l...
A tale of scale & speed: How the US Navy is enabling software delivery from l...
sonjaschweigert1
 
Accelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish CachingAccelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish Caching
Thijs Feryn
 
SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdf
SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdfSAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdf
SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdf
Peter Spielvogel
 
Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyes
ThousandEyes
 
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Ramesh Iyer
 
PCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase TeamPCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase Team
ControlCase
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
91mobiles
 
The Future of Platform Engineering
The Future of Platform EngineeringThe Future of Platform Engineering
The Future of Platform Engineering
Jemma Hussein Allen
 
PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)
Ralf Eggert
 
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
UiPathCommunity
 
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdfObservability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Paige Cruz
 
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 previewState of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
Prayukth K V
 
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdfFIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
DianaGray10
 
Leading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdfLeading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdf
OnBoard
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
Kari Kakkonen
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
KatiaHIMEUR1
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance
 
Bits & Pixels using AI for Good.........
Bits & Pixels using AI for Good.........Bits & Pixels using AI for Good.........
Bits & Pixels using AI for Good.........
Alison B. Lowndes
 

Recently uploaded (20)

Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
 
A tale of scale & speed: How the US Navy is enabling software delivery from l...
A tale of scale & speed: How the US Navy is enabling software delivery from l...A tale of scale & speed: How the US Navy is enabling software delivery from l...
A tale of scale & speed: How the US Navy is enabling software delivery from l...
 
Accelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish CachingAccelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish Caching
 
SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdf
SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdfSAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdf
SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdf
 
Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyes
 
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
 
PCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase TeamPCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase Team
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
 
The Future of Platform Engineering
The Future of Platform EngineeringThe Future of Platform Engineering
The Future of Platform Engineering
 
PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)
 
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
 
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdfObservability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
 
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 previewState of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
 
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdfFIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
 
Leading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdfLeading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdf
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
 
Bits & Pixels using AI for Good.........
Bits & Pixels using AI for Good.........Bits & Pixels using AI for Good.........
Bits & Pixels using AI for Good.........
 

[JS EXPERIENCE 2018] Javascript Event Loop além do setInterval - Derek Stavis

  • 4. call stack event loop callback queue vendor APIs
  • 5. Globalcode – Open4education Heap Memory Available Task Queue listOnTimeout listOnTimeout listOnTimeout listOnTimeout listOnTimeout Delayed Tasks Call Stack write() saveFile() updateTime() tryOnTimeout listOnTimeout Execution Contexts Vendor APIs (Node, Web, GJS) Runtime and Platform Abstraction Event Loop Task Scheduler
  • 6. Globalcode – Open4education Heap Memory Available Task Queue listOnTimeout listOnTimeout listOnTimeout listOnTimeout listOnTimeout Delayed Tasks Call Stack write() saveFile() updateTime() tryOnTimeout listOnTimeout Execution Contexts Vendor APIs (Node, Web, GJS) Runtime and Platform Abstraction Event Loop Task Scheduler VENDOR DEPENDENT VENDOR DEPENDENT ECM A262 VENDOR DEPENDENT ECM A262 OVERLAP VENDOR DEPENDENT ECM A262 OVERLAP
  • 7. Globalcode – Open4education call stack ∙ task queue ∙ event loop ∙ vendor APIs Vendor Dependent Vendor APIs
  • 11. Demo
  • 12. Web var tID = setTimeout(callback, [delay[, ...args]]) var tID = setTimeout(callback, [delay]) var tID = setTimeout(code[, delay]) var iID = setInterval(func, delay[, ...args]) var iID = setInterval(code, delay) clearTimeout(tID) clearTimeout(iID) https://www.w3.org/standards/webdesign/script
  • 13. Node var timeout = setTimeout(callback, [delay, [...args]]) var interval = setInterval(callback, [delay, [...args]]) var immediate = setImmediate(callback[, ...args]) clearTimeout(timeout) clearInterval(interval) clearImmediate(immediate) https://nodejs.org/dist/latest-v10.x/docs/api/
  • 14. Node console.log('start'); process.nextTick(() => { console.log('nextTick callback'); }); console.log('scheduled'); https://nodejs.org/dist/latest-v10.x/docs/api/
  • 15. GJS const { mainloop } = imports mainloop.timeout_add(1, () => log(“Hello World”)) mainloop.timeout_add(1, mainloop.quit) 
 mainloop.run() GJSdocs scattered around modules
  • 16. Johnny Five // Blink an LED var five = require("johnny-five") var board = new five.Board() board.on("ready", function() { var led = new five.Led(13) led.blink() }); http://johnny-five.io/api/led/#usage http://johnny-five.io/api/
  • 17. Globalcode – Open4education call stack ∙ task queue ∙ event loop ∙ vendor APIs ECMA 8.4 Jobs and Job Queues & ECMA 8.6 RunJobs() Call Stack
  • 18. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply = (a, b) => a * b const square = (number) => multiply(number, number) const prints = (number) => console.log(square(number))
 
 prints()
  • 19. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply = (a, b) => a * b const square = (number) => multiply(number, number) const prints = (number) => console.log(square(number))
 
 prints() main
  • 20. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply = (a, b) => a * b const square = (number) => multiply(number, number) const prints = (number) => console.log(square(number))
 
 prints() prints main
  • 21. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply = (a, b) => a * b const square = (number) => multiply(number, number) const prints = (number) => console.log(square(number))
 
 prints() prints main
  • 22. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply = (a, b) => a * b const square = (number) => multiply(number, number) const prints = (number) => console.log(square(number))
 
 prints() prints main
  • 23. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply = (a, b) => a * b const square = (number) => multiply(number, number) const prints = (number) => console.log(square(number))
 
 prints() square prints main
  • 24. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply = (a, b) => a * b const square = (number) => multiply(number, number) const prints = (number) => console.log(square(number))
 
 prints() square prints main
  • 25. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply = (a, b) => a * b const square = (number) => multiply(number, number) const prints = (number) => console.log(square(number))
 
 prints() multiply square prints main
  • 26. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply = (a, b) => a * b const square = (number) => multiply(number, number) const prints = (number) => console.log(square(number))
 
 prints() multiply square prints main
  • 27. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply = (a, b) => a * b const square = (number) => multiply(number, number) const prints = (number) => console.log(square(number))
 
 prints() multiply square prints main
  • 28. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply = (a, b) => a * b const square = (number) => multiply(number, number) const prints = (number) => console.log(square(number))
 
 prints() square prints main
  • 29. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply = (a, b) => a * b const square = (number) => multiply(number, number) const prints = (number) => console.log(square(number))
 
 prints() square prints main
  • 30. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply = (a, b) => a * b const square = (number) => multiply(number, number) const prints = (number) => console.log(square(number))
 
 prints() prints main
  • 31. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply = (a, b) => a * b const square = (number) => multiply(number, number) const prints = (number) => console.log(square(number))
 
 prints() console.log prints main
  • 32. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply = (a, b) => a * b const square = (number) => multiply(number, number) const prints = (number) => console.log(square(number))
 
 prints() prints main
  • 33. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply = (a, b) => a * b const square = (number) => multiply(number, number) const prints = (number) => console.log(square(number))
 
 prints() main
  • 34. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply = (a, b) => a * b const square = (number) => multiply(number, number) const prints = (number) => console.log(square(number))
 
 prints()
  • 35. Globalcode – Open4education call stack ∙ task queue ∙ event loop ∙ vendor APIs And some of Event Loop Task Queue
  • 36. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000) const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000)
  • 37. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000) main const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000)
  • 38. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000) setTimeout main
  • 39. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000) listOnTimeout, 2000 setTimeout main
  • 40. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000) main const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000) listOnTimeout, 2000
  • 41. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000) const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000) listOnTimeout, 2000
  • 42. Globalcode – Open4education call stack ∙ task queue ∙ event loop ∙ vendor APIs Vendor Dependent & Partially described in ECMA Event Loops
  • 43. An infinite loop while (queue.waitForMessage()) { queue.processNextMessage(); }
  • 44. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000) const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000) listOnTimeout, 2000 tryOnTimeout listOnTimeout
  • 45. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000) prints tryOnTimeout listOnTimeout
  • 46. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000) prints tryOnTimeout listOnTimeout
  • 47. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000) prints tryOnTimeout listOnTimeout
  • 48. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000) prints tryOnTimeout listOnTimeout const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000)
  • 49. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000) square prints tryOnTimeout listOnTimeout const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000)
  • 50. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000) square prints tryOnTimeout listOnTimeout
  • 51. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000) multiply square prints tryOnTimeout listOnTimeout const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000)
  • 52. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000) square prints tryOnTimeout listOnTimeout const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000)
  • 53. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000) square prints tryOnTimeout listOnTimeout const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000)
  • 54. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000) prints tryOnTimeout listOnTimeout const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000)
  • 55. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000) prints tryOnTimeout listOnTimeout const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000)
  • 56. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000) prints tryOnTimeout listOnTimeout const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000)
  • 57. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000) console.log prints tryOnTimeout listOnTimeout const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000)
  • 58. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000) tryOnTimeout listOnTimeout const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000)
  • 59. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000) tryOnTimeout listOnTimeout const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000)
  • 60. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000) listOnTimeout const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000)
  • 61. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000) const multiply (a, b) => a * b const square (number) => multiply(number, number) const prints (number) => console.log(square(number)) setTimeout(prints, 2000)
  • 62. So that’s it for event loops, right?
  • 63. The loop dequeues an event, dispatches the callback…
  • 64. And setTimeout and setInterval adds callbacks to queue…
  • 65. And every tick the loop consumes an item from the queue…
  • 66. Then
  • 68. Promise case console.log('script start'); 
 new Promise(resolve => { resolve(); console.log('executor'); }) .then(() => console.log('then'); 
 console.log('script end');
  • 69. script start script end then
 executor B A C D script start then
 executor
 script end script start script end executor then script start then
 executor
 script end
  • 70. script start then
 executor
 script end script start script end then
 executor B A C script start script end executor then D script start then
 executor
 script end
  • 73. Browser console console.log('script start'); setTimeout(() => console.log('setTimeout'), 0); requestAnimationFrame(() => console.log('requestAnimationFrame')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end');
  • 74. script start script end setTimeout promise1 promise2 script start script end promise1 promise2 setTimeout B A C script start setTimeout promise1 promise2 script end D script start promise1 promise2 setTimeout
 script end
  • 75. script start script end
 setTimeout promise1 promise2 script start script end promise1 promise2 setTimeout B A C script start setTimeout promise1 promise2 script end D script start setTimeout promise1 promise2
 script end
  • 79.
  • 82. As part of the W3C HTML standard
  • 83. Globalcode – Open4education Heap Memory Available Macrotask Queue listOnTimeout listOnTimeout Delayed Tasks Call Stack write() saveFile() updateTime() tryOnTimeout listOnTimeout Execution Contexts Web API Runtime and Platform Abstraction Event Loop Task Scheduler Microtask Queue promiseReactionJob promiseReactionJob
  • 84. After the end of each macrotask, drain the microtask queue https://html.spec.whatwg.org/multipage/webappapis.html#event-loop-processing-model
  • 86. Other relevant queues looks like microtask’s https://html.spec.whatwg.org/multipage/webappapis.html#event-loop-processing-model
  • 87. Paint Window Resize Media Queries Intersections Microtask Render Update Checkpoint Scroll Steps Pending targets Animation Frame Callback list Fullscreen Pending events Animations Pending targets Macrotask Loop
  • 88. Every tick is made of these steps
  • 89. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame main Macrotask
  • 90. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame main Macrotask
  • 91. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame console.log main Macrotask
  • 92. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame setTimeout main Macrotask
  • 93. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame setTimeout main timeout1 Macrotask
  • 94. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame requestAnimationFrame main timeout1 Macrotask
  • 95. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame requestAnimationFrame main timeout1 reqAnimFrm1 Macrotask
  • 96. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame Promise.resolve main timeout1 reqAnimFrm1 Macrotask
  • 97. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame Promise.then main timeout1 reqAnimFrm1 promise1 Macrotask
  • 98. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame Promise.then main timeout1 reqAnimFrm1 promise1 promise2 Macrotask
  • 99. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame console.log main timeout1 reqAnimFrm1 promise1 promise2 Macrotask
  • 100. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame main timeout1 reqAnimFrm1 promise1 promise2 Macrotask
  • 101. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame timeout1 reqAnimFrm1 promise1 promise2 Macrotask
  • 102. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame timeout1 reqAnimFrm1 promise1 promise2 Microtask
  • 103. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame timeout1 reqAnimFrm1 promise2 Microtask <anonymous>
  • 104. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame timeout1 reqAnimFrm1 promise2 Microtask console.log <anonymous>
  • 105. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame timeout1 reqAnimFrm1 promise2 Microtask <anonymous>
  • 106. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame timeout1 reqAnimFrm1 promise2 Microtask
  • 107. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame timeout1 reqAnimFrm1 Microtask <anonymous>
  • 108. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame timeout1 reqAnimFrm1 Microtask console.log <anonymous>
  • 109. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame timeout1 reqAnimFrm1 Microtask <anonymous>
  • 110. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame timeout1 reqAnimFrm1 Render Update
  • 111. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame timeout1 reqAnimFrm1 Render Update Window Resize
  • 112. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame timeout1 reqAnimFrm1 Render Update Scroll Steps
  • 113. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame timeout1 reqAnimFrm1 Render Update Media Queries
  • 114. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame timeout1 reqAnimFrm1 Render Update Animations
  • 115. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame timeout1 reqAnimFrm1 Render Update Fullscreen
  • 116. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame timeout1 reqAnimFrm1 Render Update Animation Frame
  • 117. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame timeout1 Render Update Animation Frame <anonymous>
  • 118. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame timeout1 Render Update Animation Frame console.log <anonymous>
  • 119. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame timeout1 Render Update Animation Frame <anonymous>
  • 120. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame timeout1 Render Update Animation Frame
  • 121. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame timeout1 Render Update Intersections
  • 122. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame timeout1 Render Update Paint
  • 123. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame Macrotask timeout1
  • 124. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame Macrotask <anonymous>
  • 125. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame console.log <anonymous> Macrotask
  • 126. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame Macrotask <anonymous>
  • 127. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame Macrotask
  • 128. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame Microtask
  • 129. Globalcode – Open4education Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start'); setTimeout(() => console.log('timeout1'), 0); requestAnimationFrame(() => console.log('reqAnimFrm1')); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end'); Macrotask Queue Microtask Queue Animation Frame Render Update
  • 130. Node.js console console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’);
  • 131. script start script end nextTick promise1 promise2 setTimeout setImmediate script start script end promise1 promise2 nextTick setTimeout setImmediate B A C script start script end promise1 promise2 setTimeout setImmediate nextTick D script start script end promise1 promise2 setImmediate setTimeout nextTick
  • 132. Node.js console setTimeout(() => {
 console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’);
 }, 0);
  • 133. script start script end nextTick promise1 promise2 setTimeout setImmediate script start script end nextTick promise1 promise2 setImmediate setTimeout B A
  • 134. script start script end nextTick promise1 promise2 setTimeout setImmediate script start script end nextTick promise1 promise2 setImmediate setTimeout B A
  • 135.
  • 136. Looks like Node.js has some strangeness happening
  • 138. NAMES
  • 140. Globalcode – Open4education Heap Memory AvailableDelayed Tasks Call Stack write() saveFile() updateTime() tryOnTimeout listOnTimeout Execution Contexts Node.js API Runtime and Platform Abstraction Event Loop Task Scheduler Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks Task Queues
  • 141. The queues are consumed in order, top-down
  • 142. nextTick → microTask nextTick → microTask nextTick → microTask nextTick → microTask nextTick → microTask nextTick → microTask Globalcode – Open4education Pending Callbacks Idle, Prepare Timers Poll Check Close Callbacks Checks timers that expired and call their callbacks Exhaust the pending queue: Delivers system error callbacks such as ECONNREFUSED Node.js internal Exhausts poll queue: Delivers callbacks for file reads, socket listening, incoming connections Exhausts "immediate" queue: Delivers callbacks for setImmediate calls Exhausts this callbacks queue: Delivers callbacks for socket close & destroy, errors setInterval, setTimeout server.listen
 socket.on('data')
 fs.readFile setImmediate socket.close() socket.destroy() Checkpoint Repeat socket.on('error')
  • 143.
  • 144. nextTick → microTask nextTick → microTask nextTick → microTask nextTick → microTask nextTick → microTask nextTick → microTask Globalcode – Open4education Pending Callbacks Idle, Prepare Timers Poll Check Close Callbacks Checks timers that expired and call their callbacks Exhaust the pending queue: Delivers system error callbacks such as ECONNREFUSED Node.js internal Exhausts poll queue: Delivers callbacks for file reads, socket listening, incoming connections Exhausts "immediate" queue: Delivers callbacks for setImmediate calls Exhausts this callbacks queue: Delivers callbacks for socket close & destroy, errors setInterval, setTimeout server.listen
 socket.on('data')
 fs.readFile setImmediate socket.close() socket.destroy() Checkpoint Repeat socket.on('error')
  • 145. Node.js console console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’);
  • 146. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask main
  • 147. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask console.log main
  • 148. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask setTimeout main
  • 149. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask setTimeout main
  • 150. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask process.nextTick main
  • 151. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask process.nextTick main
  • 152. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask setImmediate main
  • 153. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask setImmediate main
  • 154. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask Promise.resolve main
  • 155. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask Promise.then main
  • 156. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask Promise.then main
  • 157. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask Promise.then main
  • 158. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask Promise.then main
  • 159. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask console.log main
  • 160. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask main
  • 161. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask
  • 162. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask <anonymous>
  • 163. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask console.log <anonymous>
  • 164. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask <anonymous>
  • 165. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask
  • 166. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask <anonymous>
  • 167. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask console.log <anonymous>
  • 168. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask <anonymous>
  • 169. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask
  • 170. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask <anonymous>
  • 171. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask console.log <anonymous>
  • 172. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask <anonymous>
  • 173. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask
  • 174. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask <anonymous>
  • 175. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask console.log <anonymous>
  • 176. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask <anonymous>
  • 177. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask
  • 178. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask <anonymous>
  • 179. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask console.log <anonymous>
  • 180. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask <anonymous>
  • 181. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask
  • 182. Globalcode – Open4education Task Queue Delayed Tasks Call Stack Execution Contexts Event Loop Task Scheduler console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’); Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks nextTick microTask
  • 183. Node.js console setTimeout(() => {
 console.log('script start’); setTimeout(() => console.log('setTimeout'), 0); process.nextTick(() => console.log(‘nextTick')); setImmediate(() => console.log('setImmediate'), 0); Promise.resolve() .then(() => console.log('promise1')) .then(() => console.log('promise2')); console.log('script end’);
 }, 0);
  • 184. script start script end nextTick promise1 promise2 setTimeout setImmediate script start script end nextTick promise1 promise2 setImmediate setTimeout B A
  • 185. script start script end nextTick promise1 promise2 setTimeout setImmediate script start script end nextTick promise1 promise2 setImmediate setTimeout B A
  • 186.
  • 187. Recap
  • 188. That diagram is an oversimplification
  • 189. Globalcode – Open4education Heap Memory Available Task Queue listOnTimeout listOnTimeout listOnTimeout listOnTimeout listOnTimeout Delayed Tasks Call Stack write() saveFile() updateTime() tryOnTimeout listOnTimeout Execution Contexts Vendor APIs (Node, Web, GJS) Runtime and Platform Abstraction Event Loop Task Scheduler
  • 190. Stuff ends up being like this on the Web
  • 191. Globalcode – Open4education Heap Memory Available Macrotask Queue listOnTimeout listOnTimeout Delayed Tasks Call Stack write() saveFile() updateTime() tryOnTimeout listOnTimeout Execution Contexts Web API Runtime and Platform Abstraction Event Loop Task Scheduler Microtask Queue promiseReactionJob promiseReactionJob
  • 192. And like this in Node.js
  • 193. Globalcode – Open4education Heap Memory AvailableDelayed Tasks Call Stack write() saveFile() updateTime() tryOnTimeout listOnTimeout Execution Contexts Node.js API Runtime and Platform Abstraction Event Loop Task Scheduler Timers Pending Callbacks Idle, Prepare Poll Check Close Callbacks Task Queues
  • 195. JavaScript is popular on Node.js and Web
  • 196. But you can use it everywhere
  • 197. You can build your own event loop tied to your needs