Render an Observable with the Async Pipe

John Lindquist
InstructorJohn Lindquist
Share this video with your friends

Social Share Links

Send Tweet
Published 9 years ago
Updated 2 years ago

Angular templates use a special Async pipe to be able to render out Observables. This lesson covers the syntax used to create an Observable in Angular and then to render it out in the template.

https://github.com/johnlindquist/rxjs-in-angular2/tree/11aa4c29a4536dad0ef26b78d8f7f503e4372f74/src

[00:00] We're just starting with a "Hello World" Angular 2 app, where we bootstrap an app, and this app is exported from here with a field of message, says "Hello World," and then render it out in the template, so it gives us "Hello World."

[00:12] To start with our clock, we'll create a field of clock, assign that to Observable. We need to import Observable, which we'll do from RxJS/Observable. We want to import Observable.

[00:28] We can do Observable.interval. We'll say this is an interval of one second. If I try and run this right now...I'll refresh, you can see I'll get an error saying that interval down here is not a function.

[00:43] What that means is you need to import every method on Observable by itself, so we'll import interval. When I hit Save and run this again, you'll see that error will go away.

[00:55] If you wanted to, you could just import all of RxJS by just importing Rx and you can see we won't have an error here. But that imports the whole shebang versus just importing one method off of it, and RxJS can be a pretty big library if you try to and imported everything.

[01:11] To use our Observable, just our clock, we'll drop it into our template, just say clock, we'll hit Save and refresh, and you might expect to get the clock. But what we get is an object. That's because the Observable we get back is an object.

[01:27] That object pushes out values asynchronously so we have a pipe called async which can handle that. If we just say pipe and then the word async and we refresh. Now you can see we get zero, one, two, three, every one second, it's incrementing.

[01:45] What's happening here with this async pipe is that if we do the same thing just in the constructor, if we were to say, this.clock.subscribe, as you would with any other Observable, and then just log out the result, console log and bind it to the console. You'd see that in the console now, it'll log out those same zero, one, two, three.

[02:08] That's because async and the template is simply doing a subscribe on this Observable and it's rendering out this value, whereas, compared to here with the subscribe it's just logging it out to the console.

Simon
Simon
~ 8 years ago

How do you setup this and get it up and running? I can't figure it out from the github repo....

jolmari
jolmari
~ 8 years ago

I noticed that if I use the async pipe operator more than once in my local test project template code, I get multiple calls to the API method called. Is there a way to call the async once on an Observable and then store the result for ex. separate *ngFor and *ngIf operators in the same template?

William Grasel
William Grasel
~ 8 years ago

What about the tree shaking strategy? It should eliminate the problem of import the whole rxjs library, and then we don't need to import each method every time, right?

Jesse
Jesse
~ 8 years ago

If anyone has gotten this project to run, please share instructions. Thank You

themathmagician
themathmagician
~ 8 years ago

Looks like the Plunker link og github is wrong ?

themathmagician
themathmagician
~ 8 years ago

Ok, found a working link to gist here: https://github.com/johnlindquist/rxjs-in-angular2 The plunker link on the lesson itself is wrong: https://github.com/eggheadio-projects/angular-rxjs-time-machine/tree/angular-2-rendering-an-observable-with-the-async-pipe

Tom Stones
Tom Stones
~ 8 years ago

If you are getting the 'exclude' error, hard code the typescript version to 2.0.10.

I then got a 'permission denied' error because the output path was to the root directory (e.g "/build" not __dirname + "/build")

I have submitted a pull request:

https://github.com/eggheadio-projects/angular-rxjs-time-machine/pull/1

( I had to edit this 3 times cos i kept screwing up the directory example.sorry)

Jesse
Jesse
~ 8 years ago

@Tom in your repo, only a couple of files actually clone correctly, but that seems to also be the case in the original version you forked. I ended up downloading instead of cloning the original, and then applying your changes. It worked thanks.

technokon
technokon
~ 8 years ago

Great lesson! Why are we binding console to console.log?

Suhail Taj Shaik
Suhail Taj Shaik
~ 8 years ago

Can you give me some noted which node modules have you installed for up and running this Project

Kevin Pinny
Kevin Pinny
~ 7 years ago

I'm probably super late for this one, but I just throw it out here for anyone who is wondering. I was wondering the same thing. Behind the scenes what | async does is subscribing to the observable to the observer sees values passing by. Unsubscribing is handled by Angular 2, so you won't need to worry about that.

It behaves exactly like a normal subscribe and subscribe means, start the execution. This implies that when using the async pipe on the same observable in multiple places is that you start multiple separate executions, which all of them will call the API (resulting in multiple API calls). Whenever you want to share the execution between multiple observers, a Subject should be used.

Rasih
Rasih
~ 7 years ago

Hi. How should webstorm configured to complete rxjs interval import as in the video ?

I followerd these but it does not worked

In Webstorm

  1. Go to Languages & Frameworks under settings
  2. Select Javascript - > Libraries
  3. Add
  • Name : rxjs
  • Frameworktype : node_modules
  • Visibility : Project
  • Attach directory - select rxjs folder under node_moldules folder
  • Attach files - add files under rxjs folder

Other thing is there any Webstorm configuration lesson for Angular ?

Markdown supported.
Become a member to join the discussionEnroll Today