Sobes.tech
Middle

```javascript console.log("Start"); setTimeout(() => { console.log("Timeout 1"); Promise.resolve().then(() => console.log("Promise inside Timeout")); }, 0); Promise.resolve() .then(() => { console.log("Promise 0"); setTimeout(() => console.log("Timeout inside Promise"), 0); }) .catch(() => console.log("Promise 1")) .then(() => console.log("Promise 2")); function foo() { Promise.resolve().then(() => { console.log("Promise 3"); foo(); }); } foo(); requestAnimationFrame(() => { console.log("RequestAnimationFrame"); }); console.log("End"); // Start // END // "Promise 0" // Promise 2 // // Timeout 1 // Promise inside Timeout // RequestAnimationFrame // Timeout inside Promise ```

sobes.tech AI

Answer from AI

This example demonstrates the order of execution of synchronous code, microtasks (Promises), macrotasks (setTimeout), and requestAnimationFrame.

Explanation of the output order:

  1. Synchronous code executes immediately:

    • "Start"
    • "End"
  2. Microtasks (Promises) execute after the current stack:

    • "Promise 0" (from the first Promise)
    • "Promise 2" (after catch)
    • "Promise 3" (from the recursive call to foo, which queues a new Promise in microtasks)
    • The recursion of foo() creates an infinite chain of microtasks, but browsers limit the depth to prevent blocking.
  3. Macrotasks (setTimeout with 0) execute after microtasks:

    • "Timeout 1"
    • "Timeout inside Promise"
  4. Inside "Timeout 1" there is a Promise that is queued in microtasks after this macrotask:

    • "Promise inside Timeout"
  5. requestAnimationFrame is called after rendering, usually after macrotasks:

    • "RequestAnimationFrame"

The approximate final order is:

Start
End
Promise 0
Promise 2
Promise 3
Timeout 1
Promise inside Timeout
RequestAnimationFrame
Timeout inside Promise

Note that due to recursion, microtasks can accumulate, which may lead to an infinite loop or stack overflow in real conditions.


A simplified example code demonstrating microtasks and macrotasks:

console.log('Start');

setTimeout(() => console.log('Timeout'), 0);

Promise.resolve().then(() => console.log('Promise'));

console.log('End');

The output will be:

Start
End
Promise
Timeout