Bird
Raised Fist0
Node.jsframework~20 mins

Sequential vs parallel async execution in Node.js - Practice Questions

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Challenge - 5 Problems
🎖️
Async Execution Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
🧠 Conceptual
intermediate
2:00remaining
Understanding async function execution order
Consider two async functions called one after another without awaiting the first. What is the behavior of their execution?
Node.js
async function first() {
  console.log('First start');
  await new Promise(resolve => setTimeout(resolve, 100));
  console.log('First end');
}

async function second() {
  console.log('Second start');
  await new Promise(resolve => setTimeout(resolve, 50));
  console.log('Second end');
}

first();
second();
ALogs 'First start', then 'Second start', then 'Second end', then 'First end' in that order.
BLogs 'First start', 'First end', 'Second start', 'Second end' in that order.
CLogs 'Second start', 'Second end', 'First start', 'First end' in that order.
DLogs 'First start', 'Second start', 'First end', 'Second end' in that order.
Attempts:
2 left
💡 Hint
Think about how async functions start immediately but pause at await.
component_behavior
intermediate
2:00remaining
Effect of awaiting promises sequentially vs in parallel
What is the total approximate time taken by the following two code snippets, assuming each asyncTask takes 100ms to complete?
Node.js
async function asyncTask() {
  return new Promise(resolve => setTimeout(resolve, 100));
}

// Snippet 1
async function sequential() {
  await asyncTask();
  await asyncTask();
}

// Snippet 2
async function parallel() {
  await Promise.all([asyncTask(), asyncTask()]);
}
ABoth snippets take about 200ms to complete.
BSequential takes about 100ms; parallel takes about 200ms.
CBoth snippets take about 100ms to complete.
DSequential takes about 200ms; parallel takes about 100ms.
Attempts:
2 left
💡 Hint
Consider if tasks run one after the other or at the same time.
🔧 Debug
advanced
2:00remaining
Identify the error in parallel async execution
What error will this code produce when run in Node.js 20+?
Node.js
async function fetchData(id) {
  return new Promise(resolve => setTimeout(() => resolve(id), 100));
}

async function run() {
  const results = await Promise.all(fetchData(1), fetchData(2));
  console.log(results);
}

run();
ASyntaxError due to missing brackets in Promise.all.
B[1, 2] logged after 100ms delay.
CTypeError: Promise.all accepts an iterable but received multiple arguments.
DReferenceError: fetchData is not defined.
Attempts:
2 left
💡 Hint
Check how Promise.all expects its arguments.
state_output
advanced
2:00remaining
State changes in sequential vs parallel async updates
Given this code, what will be the final value of count after running sequential() and parallel() respectively?
Node.js
let count = 0;

function delayAdd(value) {
  return new Promise(resolve => setTimeout(() => {
    count += value;
    resolve(count);
  }, 100));
}

async function sequential() {
  await delayAdd(1);
  await delayAdd(2);
}

async function parallel() {
  await Promise.all([delayAdd(1), delayAdd(2)]);
}
AAfter sequential: count = 3; after parallel: count = 2
BAfter sequential: count = 3; after parallel: count = 3
CAfter sequential: count = 3; after parallel: count = 1
DAfter sequential: count = 1; after parallel: count = 3
Attempts:
2 left
💡 Hint
Consider how count is updated in both cases.
📝 Syntax
expert
2:00remaining
Correct syntax for parallel async execution with error handling
Which option correctly runs two async tasks in parallel and catches errors properly?
Node.js
async function task1() {
  throw new Error('fail1');
}

async function task2() {
  return 'success2';
}

async function run() {
  // Fill in the blank
}
A
try {
  const results = await Promise.all([task1(), task2()]);
  console.log(results);
} catch (e) {
  console.error('Error:', e.message);
}
B
const results = await Promise.allSettled([task1(), task2()]);
console.log(results);
C
try {
  const results = await Promise.all(task1(), task2());
  console.log(results);
} catch (e) {
  console.error('Error:', e.message);
}
D
const results = await Promise.all([task1(), task2()]).catch(e => console.error(e));
console.log(results);
Attempts:
2 left
💡 Hint
Check how Promise.all and try/catch work together.

Practice

(1/5)
1. What is the main difference between sequential and parallel async execution in Node.js?
easy
A. Sequential async is faster than parallel async in all cases.
B. Sequential async waits for each task to finish before starting the next, while parallel async runs tasks at the same time.
C. Sequential async uses callbacks, while parallel async uses promises.
D. Sequential async runs all tasks at once, while parallel async runs them one by one.

Solution

  1. Step 1: Understand sequential async execution

    Sequential async means tasks run one after another, waiting for each to complete before starting the next.
  2. Step 2: Understand parallel async execution

    Parallel async means tasks run at the same time, without waiting for others to finish first.
  3. Final Answer:

    Sequential async waits for each task to finish before starting the next, while parallel async runs tasks at the same time. -> Option B
  4. Quick Check:

    Sequential vs parallel async = D [OK]
Hint: Sequential waits, parallel runs together [OK]
Common Mistakes:
  • Confusing which runs tasks one by one
  • Thinking parallel always uses callbacks
  • Assuming sequential is always faster
2. Which of the following is the correct syntax to run two async functions task1() and task2() in parallel using Promise.all?
easy
A. await Promise.all([task1(), task2()]);
B. Promise.all(task1(), task2());
C. await task1(); await task2();
D. task1().then(task2());

Solution

  1. Step 1: Recall Promise.all syntax

    Promise.all takes an array of promises and waits for all to complete in parallel.
  2. Step 2: Check correct usage

    The correct syntax is await Promise.all([task1(), task2()]) to run both tasks in parallel and wait for both.
  3. Final Answer:

    await Promise.all([task1(), task2()]); -> Option A
  4. Quick Check:

    Promise.all needs array of promises [OK]
Hint: Use Promise.all with array for parallel [OK]
Common Mistakes:
  • Missing array brackets in Promise.all
  • Awaiting tasks one by one (sequential)
  • Calling then() incorrectly without chaining
3. Consider this code snippet:
async function run() {
  const result1 = await task1();
  const result2 = await task2();
  return [result1, result2];
}
run().then(console.log);

What will be the order of execution and output behavior?
medium
A. task1 and task2 run in parallel; output is an array of both results.
B. Both tasks run sequentially but output is only result2.
C. task2 runs first, then task1; output is an array with reversed results.
D. task1 runs first, then task2 starts after task1 finishes; output is an array of both results.

Solution

  1. Step 1: Analyze await usage

    Each await pauses execution until the promise resolves, so task1 finishes before task2 starts.
  2. Step 2: Understand output array

    Both results are collected in order into an array and returned, so output is [result1, result2].
  3. Final Answer:

    task1 runs first, then task2 starts after task1 finishes; output is an array of both results. -> Option D
  4. Quick Check:

    Sequential await = B [OK]
Hint: Await pauses; tasks run one after another [OK]
Common Mistakes:
  • Assuming tasks run in parallel with sequential await
  • Thinking output order is reversed
  • Believing output contains only one result
4. Identify the error in this code snippet intended to run two async tasks in parallel:
async function run() {
  const results = await Promise.all(task1(), task2());
  console.log(results);
}
medium
A. Promise.all requires an array of promises, but here arguments are passed separately.
B. Await cannot be used with Promise.all.
C. task1 and task2 must be awaited separately before Promise.all.
D. console.log cannot print arrays.

Solution

  1. Step 1: Check Promise.all argument

    Promise.all expects a single array of promises, but here two arguments are passed separately.
  2. Step 2: Correct usage

    It should be Promise.all([task1(), task2()]) with square brackets to group promises.
  3. Final Answer:

    Promise.all requires an array of promises, but here arguments are passed separately. -> Option A
  4. Quick Check:

    Promise.all needs array argument [OK]
Hint: Promise.all needs array, not separate args [OK]
Common Mistakes:
  • Passing promises as separate arguments
  • Thinking await can't be used with Promise.all
  • Misunderstanding console.log capabilities
5. You have three independent async tasks: taskA(), taskB(), and taskC(). You want to run taskA and taskB in parallel, then run taskC only after both finish. Which code correctly implements this?
hard
A. const c = await taskC(); const [a, b] = await Promise.all([taskA(), taskB()]);
B. await taskA(); await taskB(); await taskC();
C. const [a, b] = await Promise.all([taskA(), taskB()]); const c = await taskC();
D. Promise.all([taskA(), taskB(), taskC()]);

Solution

  1. Step 1: Run taskA and taskB in parallel

    Using await Promise.all([taskA(), taskB()]) runs both tasks at the same time and waits for both to finish.
  2. Step 2: Run taskC after both finish

    After awaiting both, await taskC() runs taskC sequentially, ensuring it starts only after taskA and taskB complete.
  3. Final Answer:

    const [a, b] = await Promise.all([taskA(), taskB()]); const c = await taskC(); -> Option C
  4. Quick Check:

    Parallel first, then sequential = A [OK]
Hint: Use Promise.all for parallel, then await next task [OK]
Common Mistakes:
  • Running all tasks in parallel ignoring order
  • Running tasks sequentially without parallelism
  • Starting taskC before taskA and taskB finish