Understanding Async Pipe

Photo by Patrick Hendry on Unsplash

In this article, we will go through what is an async pipe and how to use it. A brief description of the async pipe is that it is a built-in angular feature and an impure pipe.

It subscribes to an observable or promise and returns the latest value that is emitted. When a new value is emitted from a promise or observable, the async pipe marks the component to be checked for changes. It creates a copy of the latest emitted output and displays the value directly in the template(screen). It even unsubscribes automatically when the component is destroyed so that memory leaks can be prevented.

The syntax for the async pipe is : {{ obj_expression | async}}

Input value to async is : subscribable/ Promise

Async Pipe with Promises

import { Component } from '@angular/core';
@Component({
selector: 'app-root',
template: `<div><h4>Promise Data without Async pipe</h4><p> {{promise}}</p></div>`,
styleUrls: ['./app.component.scss']
})
export class AppComponent {
title = 'async-pipe';
promise:string;
constructor
(){
this.getPromise().then(val=>this.promise=val);
}
getPromise():Promise<string>
{
return new Promise((resolve,reject)=>{
setTimeout(()=>resolve("Here is the promise Data"),3000)});
}
}

We can see above when the promise is resolved, the data is stored in the promise property. In the constructor, we wait for the promise to get resolved, and finally, it is stored in the promise property. Through property binding, the value is visible in the template.

Now we will see how to use an async pipe in the template and save time by binding to the promise directly.

import { Component } from '@angular/core';
@Component({
selector: 'app-root',
template: `<div><h4>Promise Data with Async pipe</h4><p>{{promise|async}}</p></div>`,
styleUrls: ['./app.component.scss']
})
export class AppComponent {
title = 'async-pipe';
promise: Promise<string>
constructor() {
this.promise=this.getPromise()
}
getPromise(): Promise<string> {
return new Promise((resolve, reject) => {
setTimeout(() => resolve("Here is the promise Data"), 3000)})
}
}

As we can see above, the promise is unresolved and it is piped to the async pipe. Async pipe then returns a new value and displays it in the view. It saves time for writing then callback and storing the intermediate data.

Async pipes with observables

import { Component } from '@angular/core';
import { Observable, Subject, Subscription } from 'rxjs';
@Component({
selector: 'app-root',
template: `<div>
<h4>Observable without Async pipe</h4>
<p>{{observable}}</p>
</div>`,
styleUrls: ['./app.component.scss']
})
export class AppComponent {
title = 'async-pipe';
observable: string;
subscription: Subscription;
constructor() {
this.subscribeObservable()
}
getObservable() {
return new Observable<string>(observer => {
setTimeout(()=>observer.next("Here is the observable data"),3000)
})
}
subscribeObservable()
{
this.subscription=this.getObservable().subscribe(v => this.observable = v);
}
ngOnDestroy()
{
this.subscription.unsubscribe();
}
}

We can see above that we created an observable which publishes a string. We have to subscribe to the observable and then store the string in the observable property. Explicitly, we have to also unsubscribe the subscription in the ngOnDestroy lifecycle hook to avoid potential memory leaks.

Now let's see how to use async pipe with observable.

import { Component } from '@angular/core';
import { Observable, Subject, Subscription } from 'rxjs';
@Component({
selector: 'app-root',
template: `<div>
<h4>Observable with Async pipe</h4>
<p>{{observable|async}}</p>
</div>`,
styleUrls: ['./app.component.scss']
})
export class AppComponent {
title = 'async-pipe';
observable: Observable<string>
constructor() {
this.observable=this.getObservable()
}
getObservable() {
return new Observable<string>(observer => {
setTimeout(()=>observer.next("Here is the observable data"),3000)})
}
}

We can see above that we piped our observable directly to the async pipe. Async pipe performs the subscription to the observable and shows the data in the view. Async pipe also unsubscribes the subscription without using any life cycle hook. If we have multiple observables, we have to individually handle the unsubscribe part but the async pipe handles it on its own.

Overall, we saw that async pipe is quite a useful built-in feature of angular and can be used with promises and observable.

Thank you ✨✨

Happy coding !!

--

--

--

An inquisitive person. A learner.

Love podcasts or audiobooks? Learn on the go with our new app.

Recommended from Medium

All Objects are Truthy Values

Just 5 minutes for JavaScript “This”

HTML, a must for website.

Comparison of different unit testing frameworks in JavaScript

Deploy a Serverless Probot/Github App on Netlify Functions

Deploy MERN app with AWS S3, Lambda, CloudFront, and Route 53.

https://youtu.be/FI7jP7Ds-xU

Sangria WebSocket Subscription with Apollo, RxJs and Hyperapp V2

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
VANDANA GUPTA

VANDANA GUPTA

An inquisitive person. A learner.

More from Medium

Communication between two separate GUIs via Multi-Threading

Oracle MySQL Heatwave — You need know now!

Score Algorithm in ElasticSearch: BM25

Leetcode|Python Linked List Column

img