SKG Node.js December 2016
It's a data structure
It's a message loop
or a message dispatcher
Why?
Javascript uses it to achieve asynchronous programming
What is asynchronous programming?
Why do we care about it?
$.ajax({ url: "/data", success: function (response) { console.log(response); }, });
function add() {
console.log('adding...');
return 2 + 2;
}
function print() {
var result = add();
console.log(result);
}
print();
function add() {
console.log('adding...');
return 2 + 2;
}
function print() {
var result = add();
console.log(result);
}
print();
main |
function add() {
console.log('adding...');
return 2 + 2;
}
function print() {
var result = add();
console.log(result);
}
print();
main |
function add() {
console.log('adding...');
return 2 + 2;
}
function print() {
var result = add();
console.log(result);
}
print();
add |
main |
function add() {
console.log('adding...');
return 2 + 2;
}
function print() {
var result = add();
console.log(result);
}
print();
console.log |
add |
main |
function add() {
console.log('adding...');
return 2 + 2;
}
function print() {
var result = add();
console.log(result);
}
print();
add |
main |
function add() {
console.log('adding...');
return 2 + 2;
}
function print() {
var result = add();
console.log(result);
}
print();
main |
function add() {
console.log('adding...');
return 2 + 2;
}
function print() {
var result = add();
console.log(result);
}
print();
console.log |
main |
function add() {
console.log('adding...');
return 2 + 2;
}
function print() {
var result = add();
console.log(result);
}
print();
main |
function add() {
console.log('adding...');
return 2 + 2;
}
function print() {
var result = add();
console.log(result);
}
print();
main |
function add() {
console.log('adding...');
return 2 + 2;
}
function print() {
var result = add();
console.log(result);
}
print();
Code that runs async
(i.e. in a non-blocking way)
uses callback functions
However,
this doesn't mean that every callback runs async
[1, 2, 3, 4].forEach(function (number) {
var result = LARGE_NUMBER ^ 999 + number;
})
Async functions that have finished, push their callback to the event loop
The event loop runs its functions when the call stack is empty
console.log('one');
setTimeout(function () {
console.log('two');
}, 0);
console.log('three');
for (var i = 0; i < 10000; i++) {
console.log('four');
}
console.log('one');
setTimeout(function () {
console.log('two');
}, 0);
console.log('three');
for (var i = 0; i < 10000; i++) {
console.log('four');
}
console.log |
main |
console.log('one');
setTimeout(function () {
console.log('two');
}, 0);
console.log('three');
for (var i = 0; i < 10000; i++) {
console.log('four');
}
setTimeout() |
main |
fn
Event loop
console.log('one');
setTimeout(function () {
console.log('two');
}, 0);
console.log('three');
for (var i = 0; i < 10000; i++) {
console.log('four');
}
console.log |
main |
fn
Event loop
console.log('one');
setTimeout(function () {
console.log('two');
}, 0);
console.log('three');
for (var i = 0; i < 10000; i++) {
console.log('four');
}
console.log |
main |
fn
Event loop
console.log('one');
setTimeout(function () {
console.log('two');
}, 0);
console.log('three');
for (var i = 0; i < 10000; i++) {
console.log('four');
}
main |
fn
Event loop
console.log('one');
setTimeout(function () {
console.log('two');
}, 0);
console.log('three');
for (var i = 0; i < 10000; i++) {
console.log('four');
}
fn
Event loop
console.log('one');
setTimeout(function () {
console.log('two');
}, 0);
console.log('three');
for (var i = 0; i < 10000; i++) {
console.log('four');
}
fn |
-
Event loop
console.log('one');
setTimeout(function () {
console.log('two');
}, 0);
console.log('three');
for (var i = 0; i < 10000; i++) {
console.log('four');
}
console.log |
fn |
-
Event loop
console.log('one');
setTimeout(function () {
console.log('two');
}, 0);
console.log('three');
for (var i = 0; i < 10000; i++) {
console.log('four');
}
fn |
-
Event loop
console.log('one');
setTimeout(function () {
console.log('two');
}, 0);
console.log('three');
for (var i = 0; i < 10000; i++) {
console.log('four');
}
-
Event loop
setTimeout(function () {
console.log('one');
}, 2000);
setTimeout(function () {
console.log('two');
}, 2000);
setTimeout(function () {
console.log('three');
}, 2000);
setTimeout(function () {
console.log('four');
}, 2000);
Thank you for listening
What the heck is the event loop anyway?
by Philip Roberts
at JSConf EU 2014
Any questions?
Thank you for listening