Asynchronisme et Event Loop en JavaScript
Benjamin Cavy
@benjamin_cavy
#JSC2019
@Speaker
Asynchronisme
@benjamin_cavy
#JSC2019
@Speaker
const printSquareSum = (a, b) =>
console.log(square(sum(a, b)));
const sum = (a, b) => a + b;
const square = n => n * n;
printSquareSum(1, 2);
Code (main)
Stack
main();
const printSquareSum = ...
const sum = ...
const square = ...
printSquareSum(1, 2);
sum(1, 2);
square(3);
console.log(9);
9
Console
@benjamin_cavy
#JSC2019
@Speaker
console.log("Start");
setTimeout(
() => console.log("Hello Tours"), 100
);
console.log("End");
console.log("Start");
Start
setTimeout();
console.log("End");
End
console.log("Hello Tours");
Hello Tours
Stack
main();
Console
Code (main)
@benjamin_cavy
#JSC2019
@Speaker
console.log("Start");
setTimeout(
() => console.log("timeout 1"), 100
);
setTimeout(
() => console.log("timeout 2"), 100
);
console.log("End");
Stack
main();
console.log("Start");
console.log("End");
Start
End
timeout 1
Console
console.log("timeout 1")
console.log(
"timeout 1"
);
Task Queue
console.log("timeout 1")
Browser APIs
console.log("timeout 2")
console.log(
"timeout 2"
);
console.log("timeout 2")
setTimeout(
() => console.log("timeout 2"),
100
);
setTimeout(
() => console.log("timeout 1"),
100
);
console.log(
"timeout 2"
);
timeout 2
Code (main)
@benjamin_cavy
#JSC2019
@Speaker
Task queue
@benjamin_cavy
#JSC2019
@Speaker
Tasks queues
@benjamin_cavy
#JSC2019
@Speaker
Render queue
@benjamin_cavy
#JSC2019
@Speaker
for (let i = 0; i < 1000; i++) {
setTimeout(() => {
console.log("start");
for (let j = 0; j < 100; j++) {}
console.log("stop");
});
}
requestAnimationFrame(
() => console.log("RAF"));
Code (main)
Stack
main();
start
stop
Console
Task Queue
Render Queue
console.log("start");
for (
let j = 0;
j < 100;
j++
) {}
console.log("stop");
console.log("RAF");
…
setTimeout();
requestAnimationFrame();
console.log("start");
for (
let j = 0;
j < 100;
j++
) {}
console.log("stop");
start
stop
console.log("RAF");
start
stop
RAF
start
stop
x1000
x999
x998
@benjamin_cavy
#JSC2019
@Speaker
for (let i = 0; i < 1000; i++) {/* … */}
const recursiveRAF = f => {
requestAnimationFrame(() => {
f();
recursiveRAF(f);
});
};
recursiveRAF(() => console.log("RAF_1"));
recursiveRAF(() => console.log("RAF_2"));
Code (main)
Stack
start
stop
Console
Task Queue
Render Queue
console.log("start");
for (
let j = 0;
j < 100;
j++
) {}
console.log("stop");
f(); // RAF_1
recursiveRAF(f);
…
console.log("start");
for (
let j = 0;
j < 100;
j++
) {}
console.log("stop");
x1000
x999
f(); // RAF_2
recursiveRAF(f);
f(); // RAF_1
console.log("RAF_1");
recursiveRAF(f);
f(); // RAF_1
recursiveRAF(f);
f(); // RAF_2
recursiveRAF(f);
f(); // RAF_1
recursiveRAF(f);
RAF_1
recursiveRAF(f);
f(); // RAF_2
console.log("RAF_2");
f(); // RAF_2
recursiveRAF(f);
RAF_2
start
stop
requestAnimationFrame();
@benjamin_cavy
#JSC2019
@Speaker
Micro tasks
@benjamin_cavy
#JSC2019
@Speaker
setTimeout(() =>
console.log("task")
);
Promise.resolve()
.then(() =>
console.log("microtask")
);
Code (main)
Stack
Console
Task Queue
Render Queue
MicroTask Queue
console.log("task")
console.log("microtask")
console.log("microtask")
microtask
console.log("task")
task
@benjamin_cavy
#JSC2019
@Speaker
const p = Promise.resolve();
for (let i = 0; i < 100000; i++) {
p.then(() =>
console.log("promise"));
}
setTimeout(() =>
console.log("timeout"));
requestAnimationFrame(() =>
console.log("RAF"));
Code (main)
Stack
Console
Task Queue
Render Queue
MicroTask Queue
console.log("promise")
x100000
console.log("RAF")
console.log("timeout")
console.log("promise")
x99999
promise
x2
x99998
x10000
console.log("RAF")
RAF
console.log("timeout")
timeout
@benjamin_cavy
#JSC2019
@Speaker
Résumé
@benjamin_cavy
#JSC2019
@Speaker
Conclusion
@benjamin_cavy
#JSC2019
@Speaker
Pointeurs
@benjamin_cavy
#JSC2019
@Speaker
Merci de votre attention !
@benjamin_cavy
#JSC2019
@Speaker
Bonus : requestIdleCallback
requestIdleCallback(() => console.log("idle"));
{ didTimeout: boolean, timeRemaining: function }
@benjamin_cavy
#JSC2019
@Speaker