Hone logo
Hone
Problems

Angular Service Timeout Implementation

Many asynchronous operations in web applications, such as API calls or long-running computations, can sometimes take an unexpectedly long time to complete. To ensure a responsive user experience and prevent applications from becoming unresponsive, it's crucial to implement mechanisms that can cancel these operations if they exceed a predefined time limit. This challenge focuses on implementing such a timeout mechanism for an Angular service.

Problem Description

Your task is to create an Angular service that fetches data from a simulated API. This service should incorporate a timeout feature, meaning if the data fetching operation doesn't complete within a specified duration, the operation should be aborted, and an error should be returned.

Key Requirements

  1. Data Fetching: Implement a method within an Angular service that simulates fetching data. This simulation should involve a delay (e.g., using setTimeout or RxJS delay operator).
  2. Timeout Mechanism: Add a configurable timeout to the data fetching operation. If the operation takes longer than the timeout value, it should be cancelled.
  3. Error Handling: When a timeout occurs, the service method should return an observable that emits an error. The error should be distinguishable as a timeout error.
  4. Configurability: The timeout duration should be configurable.

Expected Behavior

  • When the simulated API call completes before the timeout, the service should successfully return the fetched data.
  • When the simulated API call takes longer than the timeout, the service should cancel the operation and emit a specific timeout error.
  • Subscribers to the service method should be able to handle both successful data retrieval and timeout errors gracefully.

Edge Cases to Consider

  • What happens if the timeout duration is zero or negative?
  • How does the timeout interact with rapid successive calls to the service?

Examples

Example 1: Successful Fetch

// Assume this is your service method call
myApiService.fetchDataWithTimeout(1000, 500).subscribe(
  data => console.log('Data received:', data), // Expected: 'Data received: { id: 1, name: "Sample Data" }'
  error => console.error('Error:', error)
);
  • Input:
    • timeoutDuration: 1000 milliseconds
    • dataFetchDelay: 500 milliseconds
  • Output: data observable emits { id: 1, name: "Sample Data" }.
  • Explanation: The simulated data fetch completes in 500ms, which is less than the 1000ms timeout. The data is successfully returned.

Example 2: Timeout Occurs

// Assume this is your service method call
myApiService.fetchDataWithTimeout(500, 1000).subscribe(
  data => console.log('Data received:', data),
  error => console.error('Error:', error.message) // Expected: 'Error: Request timed out after 500ms'
);
  • Input:
    • timeoutDuration: 500 milliseconds
    • dataFetchDelay: 1000 milliseconds
  • Output: error observable emits an error with a message like "Request timed out after 500ms".
  • Explanation: The simulated data fetch takes 1000ms, which is longer than the 500ms timeout. The operation is cancelled, and a timeout error is emitted.

Example 3: Zero Timeout

// Assume this is your service method call
myApiService.fetchDataWithTimeout(0, 500).subscribe(
  data => console.log('Data received:', data),
  error => console.error('Error:', error.message) // Expected: 'Error: Request timed out after 0ms' (or similar indicating immediate timeout)
);
  • Input:
    • timeoutDuration: 0 milliseconds
    • dataFetchDelay: 500 milliseconds
  • Output: error observable emits a timeout error immediately.
  • Explanation: A timeout of 0ms means the operation should be considered timed out even before it begins.

Constraints

  • The timeout duration will be a non-negative number (integer or float) representing milliseconds.
  • The simulated data fetch delay will also be a non-negative number representing milliseconds.
  • You should use RxJS operators for implementing the timeout and error handling.
  • The service method should return an Observable.

Notes

  • Consider using RxJS operators like timeout or takeUntil in conjunction with timer for implementing the timeout.
  • Define a custom error type or use a clear error message to indicate that the failure was due to a timeout.
  • Think about how to structure your service to make the timeout configurable.
Loading editor...
typescript