Advanced Async Patterns

Preview — 3 of 10 questions

What is the correct execution order of the following code, and why?

javascript
console.log('Start');

setTimeout(() => {
  console.log('Macrotask 1');
  setTimeout(() => {
    console.log('Macrotask 2');
    Promise.resolve().then(() => {
      console.log('Microtask in Macrotask 2');
    });
  }, 0);
  Promise.resolve().then(() => {
    console.log('Microtask in Macrotask 1');
  });
}, 0);

Promise.resolve().then(() => {
  console.log('Microtask 1');
  setTimeout(() => {
    console.log('Macrotask 3');
  }, 0);
});

console.log('End');
AStart → End → Microtask 1 → Macrotask 1 → Microtask in Macrotask 1 → Macrotask 3 → Macrotask 2 → Microtask in Macrotask 2
BStart → End → Microtask 1 → Macrotask 1 → Macrotask 2 → Microtask in Macrotask 1 → Microtask in Macrotask 2 → Macrotask 3
CStart → End → Macrotask 1 → Microtask 1 → Microtask in Macrotask 1 → Macrotask 2 → Microtask in Macrotask 2 → Macrotask 3
DStart → End → Macrotask 1 → Macrotask 2 → Microtask 1 → Microtask in Macrotask 1 → Microtask in Macrotask 2 → Macrotask 3

What will the following code output and why?

javascript
console.log('Before');

setTimeout(() => {
  console.log('Inside Timeout 1');
  Promise.resolve().then(() => console.log('Promise 1'));
  setTimeout(() => console.log('Inside Timeout 2'), 0);
}, 0);

Promise.resolve().then(() => {
  console.log('Inside Promise 1');
  setTimeout(() => console.log('Inside Timeout 3'), 0);
});

console.log('After');
ABefore → After → Inside Promise 1 → Inside Timeout 1 → Inside Timeout 3 → Promise 1 → Inside Timeout 2
BBefore → After → Inside Timeout 1 → Inside Promise 1 → Inside Timeout 3 → Promise 1 → Inside Timeout 2
CBefore → After → Inside Promise 1 → Inside Timeout 1 → Promise 1 → Inside Timeout 3 → Inside Timeout 2
DBefore → Inside Timeout 1 → After → Inside Promise 1 → Inside Timeout 3 → Inside Timeout 2 → Promise 1

What will the following code output?

javascript
console.log('A');

setTimeout(() => {
  console.log('B');
  Promise.resolve().then(() => console.log('C'));
}, 0);

Promise.resolve().then(() => {
  console.log('D');
  setTimeout(() => {
    console.log('E');
    Promise.resolve().then(() => console.log('F'));
  }, 0);
});

console.log('G');
AA → D → G → B → C → E → F
BA → G → D → B → C → E → F
CA → G → D → E → F → B → C
DA → G → D → B → E → F → C

Sign up free to play

Answer all 10 questions (7 more), see explanations for every answer, and track your score.