Node.js Event Loop
https://nodejs.org/en/learn/asynchronous-work/event-loop-timers-and-nexttick
https://www.freecodecamp.org/news/a-guide-to-the-node-js-event-loop/
https://nodejs.org/en/learn/asynchronous-work/understanding-setimmediate
1const baz = () => console.log('baz');
2const foo = () => console.log('foo');
3const zoo = () => console.log('zoo');
4
5const start = () => {
6 console.log('start');
7 setImmediate(baz);
8 new Promise((resolve, reject) => {
9 resolve('bar');
10 }).then(resolve => {
11 console.log(resolve);
12 process.nextTick(zoo);
13 });
14 process.nextTick(foo);
15};
16
17start();
18
19// start foo bar zoo baz
but in *.mjs is different:
1// start bar foo zoo baz
because ES Module is asyncchronous, second output is 'bar', not 'foo'
Event loop's order of operations:
1 ┌───────────────────────────┐
2┌─>│ timers │
3│ └─────────────┬─────────────┘
4│ ┌─────────────┴─────────────┐
5│ │ pending callbacks │
6│ └─────────────┬─────────────┘
7│ ┌─────────────┴─────────────┐
8│ │ idle, prepare │
9│ └─────────────┬─────────────┘ ┌───────────────┐
10│ ┌─────────────┴─────────────┐ │ incoming: │
11│ │ poll │<─────┤ connections, │
12│ └─────────────┬─────────────┘ │ data, etc. │
13│ ┌─────────────┴─────────────┐ └───────────────┘
14│ │ check │
15│ └─────────────┬─────────────┘
16│ ┌─────────────┴─────────────┐
17└──┤ close callbacks │
18 └───────────────────────────┘