Then and catch methods in Javascript - Time & Space Complexity
When using then and catch methods with promises, it's important to understand how the time to complete grows as the number of chained operations increases.
We want to know how the number of steps affects the total time the program takes.
Analyze the time complexity of chaining multiple then and catch calls.
const promise = new Promise((resolve) => resolve(1));
promise
.then(value => value + 1)
.then(value => value * 2)
.then(value => console.log(value))
.catch(error => console.error(error));
This code creates a promise and chains several then methods to process the result, ending with a catch to handle errors.
Look for repeated steps that happen as the chain grows.
- Primary operation: Each
thenorcatchcallback runs once per chain link. - How many times: The number of chained
thenorcatchcalls determines how many callbacks run in sequence.
As you add more then or catch calls, the total steps increase linearly.
| Number of chained calls (n) | Approx. Operations |
|---|---|
| 3 | 3 callbacks run in order |
| 10 | 10 callbacks run one after another |
| 100 | 100 callbacks run sequentially |
Pattern observation: The total work grows directly with the number of chained calls.
Time Complexity: O(n)
This means the time to complete grows in a straight line as you add more then or catch methods.
[X] Wrong: "Adding more then calls doesn't affect performance much because they run instantly."
[OK] Correct: Each then callback runs in order, so more calls mean more steps, which takes more time overall.
Understanding how promise chains grow helps you write efficient asynchronous code and explain your reasoning clearly in interviews.
What if we replaced the chained then calls with parallel Promise.all? How would the time complexity change?
Practice
then method do in JavaScript promises?Solution
Step 1: Understand the role of
Thethenthenmethod is used to handle the result when a promise completes successfully.Step 2: Differentiate from
Thecatchcatchmethod handles errors or failures, not success.Final Answer:
Runs when the task finishes successfully -> Option DQuick Check:
then= success handler [OK]
- Confusing then with catch
- Thinking then stops the promise
- Believing then creates a new promise
p?Solution
Step 1: Recall correct catch syntax
The catch method is called directly on the promise object likep.catch(callback).Step 2: Check each option
p.catch(() => console.log('Error')) uses correct syntax. p.then.catch(() => console.log('Error')) chains incorrectly. p.catch = () => console.log('Error') tries to assign catch as a property. catch(p, () => console.log('Error')) uses invalid function call.Final Answer:
p.catch(() => console.log('Error')) -> Option CQuick Check:
Usepromise.catch()syntax [OK]
- Chaining catch after then incorrectly
- Assigning catch as a property
- Using catch as a standalone function
Promise.resolve('Hello')
.then(msg => msg + ' World')
.then(console.log)
.catch(() => console.log('Error'));Solution
Step 1: Follow promise resolution
The promise resolves with 'Hello'. The first then adds ' World' to it, resulting in 'Hello World'.Step 2: Output from second then
The second then logs the result 'Hello World'. The catch is not called because no error occurs.Final Answer:
Hello World -> Option BQuick Check:
Promise resolves + then chains = 'Hello World' [OK]
- Expecting catch to run without error
- Ignoring value returned by first then
- Thinking console.log returns undefined
fetch('url')
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.log('Error:', error));
fetch('url')
.then(response => response.json())
.catch(error => console.log('Error:', error))
.then(data => console.log(data));Solution
Step 1: Analyze first chain
The first chain calls then twice and catch last, so errors are caught properly.Step 2: Analyze second chain
The second chain calls catch before the last then. So even if fetch fails, the last then runs with undefined data, causing possible issues.Final Answer:
The second chain logs data even if fetch fails -> Option AQuick Check:
Catch before then can cause unexpected data [OK]
- Placing catch before then incorrectly
- Assuming catch stops later then calls
- Ignoring promise chain order
then and catch to do this?Solution
Step 1: Understand chaining for dependent tasks
We want to fetch posts only if user fetch succeeds, so fetchPosts must be inside the first then.Step 2: Place catch at the end
Catch should be last to handle any error from either fetchUser or fetchPosts.Final Answer:
fetchUser().then(user => fetchPosts(user.id)).then(posts => console.log(posts)).catch(err => console.log('Error:', err)); -> Option AQuick Check:
Chain then for success, catch last for errors [OK]
- Placing catch before all then calls
- Calling then after catch causing unexpected runs
- Using multiple catch handlers unnecessarily
Ready to prove it?
Pass the test and this pattern moves unknown
