Bird
Raised Fist0
Angularframework~20 mins

Resolver for pre-fetching data in Angular - 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
🎖️
Angular Resolver Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
component_behavior
intermediate
2:00remaining
What happens when a resolver fails to fetch data?

Consider an Angular resolver that fetches user data before activating a route. If the resolver returns an error or fails, what will happen to the route activation?

Angular
import { Injectable } from '@angular/core';
import { Resolve, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { Observable, throwError } from 'rxjs';
import { catchError } from 'rxjs/operators';
import { UserService } from './user.service';

@Injectable({ providedIn: 'root' })
export class UserResolver implements Resolve<any> {
  constructor(private userService: UserService) {}

  resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<any> {
    return this.userService.getUser(route.params['id']).pipe(
      catchError(error => throwError(() => new Error('Failed to load user')))
    );
  }
}
AThe route activation will be canceled and navigation will not proceed.
BThe route will activate normally but the component will receive undefined data.
CThe route will activate but Angular will display a default error message automatically.
DThe resolver will retry fetching data indefinitely until it succeeds.
Attempts:
2 left
💡 Hint

Think about how Angular handles errors in resolvers and what happens to navigation when a resolver fails.

📝 Syntax
intermediate
2:00remaining
Identify the correct resolver syntax for pre-fetching data

Which of the following Angular resolver implementations correctly pre-fetches data and returns an observable?

A
import { Injectable } from '@angular/core';
import { Resolve, ActivatedRouteSnapshot } from '@angular/router';
import { Observable } from 'rxjs';
import { HttpClient } from '@angular/common/http';

@Injectable({ providedIn: 'root' })
export class DataResolver implements Resolve&lt;any&gt; {
  constructor(private http: HttpClient) {}
  resolve(route: ActivatedRouteSnapshot): Observable&lt;any&gt; {
    return this.http.get('/api/data');
  }
}
B
export class DataResolver implements Resolve {
  resolve(route: ActivatedRouteSnapshot): any {
    return this.http.get('/api/data').subscribe();
  }
}
C
export class DataResolver {
  resolve(route: ActivatedRouteSnapshot): Promise&lt;any&gt; {
    return fetch('/api/data');
  }
}
D
export class DataResolver implements Resolve {
  resolve() {
    return this.http.get('/api/data');
  }
}
Attempts:
2 left
💡 Hint

Remember that resolvers must implement the Resolve interface and return an observable or promise without subscribing inside.

state_output
advanced
2:00remaining
What data does the component receive from the resolver?

Given this route configuration and resolver, what will the component receive as data in ActivatedRoute?

Angular
const routes = [
  {
    path: 'profile/:id',
    component: ProfileComponent,
    resolve: { userData: UserResolver }
  }
];

@Injectable({ providedIn: 'root' })
export class UserResolver implements Resolve<User> {
  constructor(private userService: UserService) {}
  resolve(route: ActivatedRouteSnapshot): Observable<User> {
    return this.userService.getUser(route.params['id']);
  }
}

// In ProfileComponent constructor:
constructor(private route: ActivatedRoute) {
  this.route.data.subscribe(data => {
    console.log(data.userData);
  });
}
AUndefined, because resolvers do not pass data to components.
BAn observable of the user data, not yet resolved.
CAn object containing the user data fetched by the resolver.
DThe route parameters object with the user ID.
Attempts:
2 left
💡 Hint

Resolvers provide data to the route's data observable after resolving.

🔧 Debug
advanced
2:00remaining
Why does this resolver cause a runtime error?

Examine the following resolver code. Why does it cause a runtime error when navigating to the route?

Angular
export class ProductResolver implements Resolve<Product> {
  constructor(private productService: ProductService) {}

  resolve(route: ActivatedRouteSnapshot): Product {
    this.productService.getProduct(route.params['id']).subscribe(product => {
      return product;
    });
  }
}
ABecause the resolver subscribes inside and returns the subscription instead of data.
BBecause the resolver returns void instead of an observable or promise.
CBecause the ProductService method getProduct does not exist.
DBecause the resolver does not implement the Resolve interface correctly.
Attempts:
2 left
💡 Hint

Resolvers must return an observable or promise, not void or subscription.

🧠 Conceptual
expert
2:00remaining
How to handle multiple resolvers for a single route?

You want to pre-fetch both user data and settings before activating a route. Which approach correctly uses multiple resolvers in Angular routing?

AUse multiple <router-outlet> elements each with its own resolver.
BUse an array of resolvers in the route: <code>resolve: [UserResolver, SettingsResolver]</code>
CChain resolvers inside one resolver class that calls both services sequentially.
DUse an object with keys for each resolver: <code>resolve: { user: UserResolver, settings: SettingsResolver }</code>
Attempts:
2 left
💡 Hint

Think about how Angular expects the resolve property to be structured for multiple resolvers.

Practice

(1/5)
1. What is the main purpose of a Resolver in Angular routing?
easy
A. To handle user authentication during navigation
B. To fetch data before the route loads so the page shows complete information
C. To define the layout of the page components
D. To manage CSS styles for routed components

Solution

  1. Step 1: Understand Resolver role

    Resolvers are designed to fetch data before a route activates, ensuring the page has all needed data upfront.
  2. Step 2: Compare options

    Only To fetch data before the route loads so the page shows complete information describes this pre-fetching behavior. Other options describe unrelated tasks.
  3. Final Answer:

    To fetch data before the route loads so the page shows complete information -> Option B
  4. Quick Check:

    Resolver purpose = pre-fetch data [OK]
Hint: Resolvers fetch data before route loads to avoid empty pages [OK]
Common Mistakes:
  • Confusing resolvers with guards for authentication
  • Thinking resolvers manage styles or layouts
  • Assuming resolvers run after the component loads
2. Which syntax correctly defines a Resolver service in Angular?
easy
A. export class DataResolver implements Resolve { resolve(): Data { return this.service.getData(); } }
B. export class DataResolver { fetch(route: ActivatedRouteSnapshot): Data { return this.service.getData(); } }
C. export class DataResolver implements Resolve<Data> { resolve(route: ActivatedRouteSnapshot): Observable<Data> { return this.service.getData(); } }
D. export class DataResolver implements Resolve<Data> { getData(route: ActivatedRouteSnapshot): Data { return this.service.getData(); } }

Solution

  1. Step 1: Check Resolver interface implementation

    The Resolver must implement Resolve<T> and define a resolve method with route parameter returning Observable or Promise.
  2. Step 2: Validate method signature

    export class DataResolver implements Resolve<Data> { resolve(route: ActivatedRouteSnapshot): Observable<Data> { return this.service.getData(); } } correctly implements Resolve<Data> with resolve(route: ActivatedRouteSnapshot): Observable<Data>. Others miss interface, method name, or return type.
  3. Final Answer:

    export class DataResolver implements Resolve<Data> { resolve(route: ActivatedRouteSnapshot): Observable<Data> { return this.service.getData(); } } -> Option C
  4. Quick Check:

    Resolver syntax = implements Resolve<T> + resolve() [OK]
Hint: Resolver must implement Resolve<T> and have resolve(route) method [OK]
Common Mistakes:
  • Missing the Resolve interface implementation
  • Using wrong method name instead of resolve
  • Returning data directly instead of Observable or Promise
3. Given this resolver code snippet, what will be the resolved data type when navigating to the route?
export class UserResolver implements Resolve<User> {
  constructor(private userService: UserService) {}
  resolve(route: ActivatedRouteSnapshot): Observable<User> {
    const id = route.paramMap.get('id')!;
    return this.userService.getUserById(id);
  }
}
medium
A. A Promise resolving to a User ID string
B. A plain string representing the user ID
C. An array of User objects
D. A User object wrapped in an Observable

Solution

  1. Step 1: Analyze resolve method return type

    The resolve method returns this.userService.getUserById(id), which returns Observable<User> as per signature.
  2. Step 2: Understand data type returned

    The resolved data is a User object wrapped inside an Observable, not a string or array.
  3. Final Answer:

    A User object wrapped in an Observable -> Option D
  4. Quick Check:

    Resolver returns Observable<User> [OK]
Hint: Resolver returns Observable of the specified data type [OK]
Common Mistakes:
  • Confusing the route param with resolved data
  • Assuming it returns a Promise or plain value
  • Thinking it returns an array instead of single object
4. Identify the error in this resolver code:
export class ProductResolver implements Resolve<Product> {
  constructor(private productService: ProductService) {}
  resolve(route: ActivatedRouteSnapshot): Product {
    const id = route.paramMap.get('id')!;
    this.productService.getProduct(id).subscribe(product => {
      return product;
    });
  }
}
medium
A. The resolve method returns void instead of Product or Observable<Product>
B. The subscribe method is missing a callback function
C. The constructor is missing dependency injection
D. The route parameter 'id' is not accessed correctly

Solution

  1. Step 1: Check resolve method return type

    The resolve method declares it returns Product but actually returns nothing because subscribe is asynchronous and returns void.
  2. Step 2: Understand correct return for resolver

    Resolvers must return Observable<Product> or Promise<Product>, not void. Using subscribe inside resolve breaks this contract.
  3. Final Answer:

    The resolve method returns void instead of Product or Observable<Product> -> Option A
  4. Quick Check:

    Resolvers must return Observable or Promise, not void [OK]
Hint: Never subscribe inside resolve; return Observable or Promise directly [OK]
Common Mistakes:
  • Using subscribe inside resolve instead of returning Observable
  • Returning wrong data type from resolve
  • Ignoring asynchronous nature of data fetching
5. You want to pre-fetch user profile and user settings before loading a route. How can you combine two resolvers to achieve this in Angular?
hard
A. Use multiple resolvers in the route config with different keys, then access both in the component
B. Create one resolver that calls both services and merges data into one object
C. Call one resolver inside another resolver's resolve method
D. Use a guard to fetch data instead of resolvers

Solution

  1. Step 1: Understand Angular route resolver configuration

    Angular allows multiple resolvers in route config by assigning each resolver to a unique key in the 'resolve' object.
  2. Step 2: Access resolved data in component

    The component can then access both resolved data objects via ActivatedRoute's data property using the keys.
  3. Step 3: Evaluate other options

    Create one resolver that calls both services and merges data into one object is possible but less modular. Call one resolver inside another resolver's resolve method is not standard practice. Use a guard to fetch data instead of resolvers uses guards, which are not for data pre-fetching.
  4. Final Answer:

    Use multiple resolvers in the route config with different keys, then access both in the component -> Option A
  5. Quick Check:

    Multiple resolvers = multiple keys in route config [OK]
Hint: Assign multiple resolvers with keys in route config [OK]
Common Mistakes:
  • Trying to chain resolvers inside each other
  • Merging data manually instead of using multiple resolvers
  • Using guards instead of resolvers for data fetching