Bird
Raised Fist0
Node.jsframework~20 mins

Promise chaining in Node.js - Practice Problems & Coding Challenges

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
🎖️
Promise Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
component_behavior
intermediate
2:00remaining
What is the output of this Promise chain?
Consider the following Node.js code using Promise chaining. What will be logged to the console?
Node.js
Promise.resolve(5)
  .then(x => x * 2)
  .then(x => { console.log(x); return x + 1; })
  .then(x => console.log(x));
A11
B5\n6
C10
D10\n11
Attempts:
2 left
💡 Hint
Remember each then returns a new Promise with the returned value.
📝 Syntax
intermediate
2:00remaining
Which option causes a syntax error in Promise chaining?
Identify which code snippet will cause a syntax error when chaining Promises in Node.js.
APromise.resolve(1).then(x => { return x + 1 }).then(x => console.log(x));
BPromise.resolve(1).then(x => x + 1).then(x => console.log(x))
CPromise.resolve(1).then(x => x + 1).then(x => { console.log(x) });
DPromise.resolve(1).then(x => x + 1).then(x => console.log(x));
Attempts:
2 left
💡 Hint
Look carefully at parentheses and braces.
🔧 Debug
advanced
2:00remaining
Why does this Promise chain not log the expected value?
Given the code below, why does the console.log output 'undefined' instead of the expected number?
Node.js
Promise.resolve(3)
  .then(x => { x * 3; })
  .then(x => console.log(x));
AThe first then does not return a value, so x is undefined in the next then.
BPromise.resolve(3) is rejected, so then is skipped.
Cconsole.log is called before the Promise resolves.
DThe second then has a syntax error causing undefined output.
Attempts:
2 left
💡 Hint
Check if the first then returns a value explicitly.
state_output
advanced
2:00remaining
What is the final value of 'result' after this Promise chain?
Analyze the code and determine the value of the variable 'result' after the Promise chain completes.
Node.js
let result = 0;
Promise.resolve(2)
  .then(x => x + 3)
  .then(x => { result = x * 2; })
  .then(() => console.log('Done'));
A10
B0
CNaN
D5
Attempts:
2 left
💡 Hint
Follow the values through each then and how 'result' is assigned.
🧠 Conceptual
expert
3:00remaining
Which option correctly handles errors in a Promise chain?
Choose the code snippet that properly catches errors occurring in any step of the Promise chain.
A
Promise.resolve()
  .then(() => { throw new Error('Fail'); })
  .then(null, err => console.log('Caught:', err.message));
B
Promise.resolve()
  .then(() => { throw new Error('Fail'); })
  .catch(err => console.log('Caught:', err.message));
C
Promise.resolve()
  .then(() => { throw new Error('Fail'); })
  .then(() => console.log('No error'))
  .catch(err => console.log('Caught:', err.message));
D
Promise.resolve()
  .catch(err => console.log('Caught:', err.message))
  .then(() => { throw new Error('Fail'); });
Attempts:
2 left
💡 Hint
Errors thrown in any then should be caught by catch at the end.

Practice

(1/5)
1. What is the main purpose of promise chaining in Node.js?
easy
A. To convert synchronous code into asynchronous code
B. To run all asynchronous tasks at the same time
C. To run asynchronous tasks one after another in order
D. To stop all asynchronous tasks immediately

Solution

  1. Step 1: Understand asynchronous task execution

    Promise chaining allows tasks to run one after another, waiting for each to finish.
  2. Step 2: Identify the purpose of chaining

    Chaining with .then() ensures order, not parallel or immediate stop.
  3. Final Answer:

    To run asynchronous tasks one after another in order -> Option C
  4. Quick Check:

    Promise chaining = ordered async tasks [OK]
Hint: Promise chaining runs tasks step-by-step, not all at once [OK]
Common Mistakes:
  • Thinking promises run in parallel by default
  • Confusing chaining with synchronous loops
  • Believing chaining stops tasks immediately
2. Which of the following is the correct syntax to chain two promises promise1 and promise2?
easy
A. promise1.then(promise2)
B. promise1.then(promise2())
C. promise1.then.then(promise2)
D. promise1.then(() => promise2())

Solution

  1. Step 1: Understand how to pass functions to .then()

    The .then() method expects a function to call when the promise resolves.
  2. Step 2: Check each option's syntax

    promise1.then(() => promise2()) correctly passes a function that calls promise2(). Options A and B call promise2() immediately or pass wrong types. promise1.then.then(promise2) has invalid chaining syntax.
  3. Final Answer:

    promise1.then(() => promise2()) -> Option D
  4. Quick Check:

    Pass a function to then() = promise1.then(() => promise2()) [OK]
Hint: Use a function inside then() to delay calling next promise [OK]
Common Mistakes:
  • Calling the next promise immediately inside then()
  • Using double then without parentheses
  • Passing promise instead of function to then()
3. What will be logged to the console when running this code?
Promise.resolve(5)
  .then(x => x + 1)
  .then(x => { throw new Error('Fail'); })
  .catch(err => 'Caught: ' + err.message)
  .then(x => console.log(x));
medium
A. Caught: Fail
B. Fail
C. 6
D. undefined

Solution

  1. Step 1: Follow the promise chain step-by-step

    The first then adds 1 to 5, resulting in 6. The second then throws an error.
  2. Step 2: Understand error handling and final output

    The catch catches the error and returns the string 'Caught: Fail'. The last then logs this string.
  3. Final Answer:

    Caught: Fail -> Option A
  4. Quick Check:

    Error caught and message logged = Caught: Fail [OK]
Hint: Errors jump to catch, then continue chain with catch result [OK]
Common Mistakes:
  • Expecting error to stop all logging
  • Thinking catch returns undefined
  • Ignoring that catch returns a value to next then
4. Identify the error in this promise chain:
fetchData()
  .then(data => processData(data))
  .then(result => console.log(result))
  .catch(console.error())
medium
A. Missing return in first then
B. Incorrect use of catch with immediate function call
C. processData is not a function
D. console.log should be inside catch

Solution

  1. Step 1: Check the catch usage

    The catch method expects a function reference, but console.error() calls the function immediately, passing its result (undefined) instead.
  2. Step 2: Correct catch usage

    It should be .catch(console.error) without parentheses to pass the function itself.
  3. Final Answer:

    Incorrect use of catch with immediate function call -> Option B
  4. Quick Check:

    Pass function to catch, not call it immediately [OK]
Hint: Pass function to catch, don't call it with () [OK]
Common Mistakes:
  • Calling catch handler immediately instead of passing function
  • Forgetting to return promises inside then
  • Misplacing console.log inside catch
5. Given these functions:
function step1() { return Promise.resolve(2); }
function step2(x) { return Promise.resolve(x * 3); }
function step3(x) { return x + 4; }

What will this code log?
step1()
  .then(x => step2(x))
  .then(x => step3(x))
  .then(console.log);
hard
A. 10
B. Promise { 10 }
C. undefined
D. Error: step3 must return a Promise

Solution

  1. Step 1: Calculate step1 and step2 results

    step1() resolves to 2. Then step2(2) resolves to 6 (2*3).
  2. Step 2: Understand step3 return and final log

    step3(6) returns 10 (6+4) synchronously. Since then accepts a value or promise, it passes 10 to next then which logs 10.
  3. Final Answer:

    10 -> Option A
  4. Quick Check:

    Sync return in then passes value = 10 [OK]
Hint: then can handle sync values; they become resolved promises [OK]
Common Mistakes:
  • Expecting step3 to return a Promise always
  • Thinking console.log logs a Promise object
  • Confusing synchronous return with Promise return