Skip to main content

Declarative Programming in Angular with Async Pipe and shareReplay

A declarative approach is a way that focuses on writing code that specifies what the application should do, rather than detailing how it should be done. For example, with the async pipe in Angular, we don’t need to write code to manually subscribe to an Observable, handle its data, and update the view. Instead, we simply specify in the template that we want the data from the Observable using the async pipe. Angular handles all the underlying processes to retrieve and display the data

It's often used in reactive programming with RxJS and Angular's built-in features, such as the async pipe.

export class ProductComponent {

  product$ = this.productService.getProduct();
  
  constructor(private productService: ProductService) {}
}

The product observable will hold the product data and the async pipe in the template will automatically subscribe and unsubscribe observable

<div *ngIf="product$ | async as product">
  <h1>{{ product.name }}</h1>
  <p>{{ product.description }}</p>
</div>

Benefit of declarative approach:

  • Reduces boilerplate code, making the codebase cleaner and more maintainable.
  • Automates state management, minimizing the risk of errors related to manual state management and keeping data in sync between components.
  • Improves performance through Angular's change detection strategy using OnPush, which triggers only when a component is marked as dirty.
  • Helps manage complexity in larger applications by keeping the codebase clean and modular.
shareReplay

To improve performance and network load we can cach the emissions from observables. Caching/storing data locally can:

  • Improve responsiveness
  • Reduce bandwidth and network consumption
  • Lower backend server load
  • Decrease redundant computations

One approach to cach the data is to use shareReplay(bufferSize?: number). 

ShareReplay is an operator in RxJS that caches and shares/replays the defined number of emissions subscribers. This is useful in situations where we want multiple subscribers to receive the same values without resubscribing to the source Observable or re-executing expensive operations.

      this.data$ = this.http.get('https://api.example.com/data').pipe(
        // Cache the response and share it with new subscribers
        shareReplay(1)
      );

bufferSize: This parameter specifies the maximum number of values to store in the buffer. When a new subscriber joins, it will receive the last bufferSize values emitted by the source observable. If not provided, the buffer size is unlimited.

Note: The location of the shareReplay operator is crucial. Before using shareReplay, all data processing happens prior to caching. However, once shareReplay is applied, the code below shareReplay is executed during each subscription.







Comments

Popular posts from this blog

The Developer’s Guide to Clean Code: Tips and Techniques

What is clean code? Clean code is a term used to describe code that is easy to read, understand, and maintain. It is written in a way that makes it simple, concise, and expressive. Clean code follows a set of conventions, standards, and practices that make it easy to read and follow. Here are some signs indicating that the code is not clean: 1. Poor names The name is not clear to understand, meaningless, or misleading . It doesn't reveal the intention of what it want to achieve. Consider the following examples: SqlDataReader drl; int od; void Button1_Click(); Class Pages1 In the examples above, it’s challenging to get the purpose of drl, od, or what Button1_Click() does. To enhance clarity, we can rename these identifiers as follows: SqlDataReader dataReader/reader; int overdueDays; void CheckAvailability_Click(); Class ViewCustomerPage {} Ambiguous names int? incidentNameId for instance. incidentNameId lacks clarity because if it represents the ID of an incident, then the inclu...

Date and Time in .NET: DateTime, DateTimeOffset, TimeZoneInfo, DateOnly, TimeOnly, and TimeSpan

What is UTC UTC (Coordinated Universal Time) is the world’s primary time standard used to regulate clocks and time zones. It serves as the reference point for civil time worldwide, ensuring that all local times are defined by their offset from UTC. DateTime The DateTime class provides a way to work with dates and times without including an offset. This approach can reduce a certain level of accuracy when dealing with time zones. For example, calling DateTime.Now returns the current date and time based on your computer’s local time zone. DateTime.Now gives you the local time, while DateTime.UtcNow returns the universal coordinated time (UTC). You typically use DateTime when you only need to track the date and time itself, without worrying about time zones. This is suitable for scenarios such as birthdays, deadlines, or local schedules, especially when your application is used primarily within a single time zone. The DateTime class also includes a Kind property, which provides limited in...