Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Reactive Applications with Angular 2 and RxJS

Reactive Applications with Angular 2 and RxJS

JS Kongress 2016

Avatar for Sebastian Müller

Sebastian Müller

November 28, 2016
Tweet

Other Decks in Programming

Transcript

  1. What is Angular 2? • Framework for developing web apps

    und mobile apps • Is developed by Google • Complete rewrite in TypeScript • Rewrite took about 2.5 years • New official website: https://angular.io/
  2. A Simple Angular Component import { Component } from '@angular/core';

    @Component({ selector: 'my-user-profile', template: ` <h1>User: {{ username }}</h1> ` }) export class UserProfileComponent { username: string = 'John'; } Decorator (metadata) HTML template CSS selector
 <my-user-profile></my-user-profile>
  3. • Rx = Reactive Extensions • Library for reactive programming

    • Version 5 is a complete rewrite • Dependency of Angular 2 • Observable is the main building block • RxJS is an observable implementation • Many other Rx libraries for other languages
 available (reactivex.io) RxJS
  4. Sync / Pull Async / Push Single value Multiple values

    Functions Iterators Promises Observables
  5. import { Observable } from 'rxjs/Observable'; var observable = new

    Observable((observer) => {
 console.log('start'); var i = 0; setInterval(() => { observer.next(i++); }, 1000); }); Observable var subscription = observable.subscribe((value) => { console.log(value); }); Lazy Emit a new value 0 1 2 3 Stream of events Time
  6. Observable - unsubscribe var subscription = observable.subscribe((value) => { console.log(value);

    }); import { Observable } from 'rxjs/Observable'; var observable = new Observable((observer) => {
 console.log('start'); var i = 0; var id = setInterval(() => { observer.next(i++); }, 1000); return () => {
 console.log('unsubscribe'); clearInterval(id); }; }); Cleanup } setTimeout(() => { subscription.unsubscribe(); }, 2500); start 0 1 unsubscribe
  7. Advantages of RxJS/Observables in comparison to Promises • Observables… •

    …can emit multiple values over time • …are cancelable • …provide useful operators to transform the stream
  8. HTTP Requests in Angular 2 import { Component } from

    '@angular/core'; 
 @Component({ selector: 'app-attendee-list', template: `
 <h1>Conference Attendees</h1> <div *ngFor="let attendee of attendees"> {{ attendee.name }} </div> ` }) export class AttendeeListComponent { attendees: Attendee[];
 } constructor(http: Http) {
 http.get('/api/attendees.json').subscribe((result) => {
 this.attendees = result;
 });
 } import { Http } from '@angular/http';
 It doesn't work :-( Response instance
  9. RxJS Operators - map var observable = new Observable((observer) =>

    { observer.next(4); observer.next(5); observer.next(6); }).map(value => value * 2); observable.subscribe((value) => console.log(value)); 4 5 6 Time 8 10 12 Time transforms the emitted value,
 returns a new observable
  10. RxJS Operators • Over 100 operators available • Commonly used:

    • map • filter • pluck • mergeMap/flatMap • debounceTime Learn more: https://www.learnrxjs.io
  11. HTTP Requests in Angular 2 import { Component } from

    '@angular/core'; import { Http } from '@angular/http';
 import 'rxjs/add/operator/map';
 @Component({ selector: 'app-attendee-list', template: `
 <h1>Conference Attendees</h1> <div *ngFor="let attendee of attendees"> {{ attendee.name }} </div> ` }) export class AttendeeListComponent { attendees: Attendee[];
 constructor(http: Http) {
 http.get('/api/attendees') .map(response => response.json()) .subscribe((result) => this.attendees = result);
 } } parse the JSON response body
  12. Pipes in Angular 2 • Pipes transform values: • Date

    Pipe
 <div>{{ myDate | date:'yMMMdjms' }}</div> • JSON Pipe
 <div>{{ myObj | json }}</div> • Currency Pipe
 <div>{{ myValue | currency:'USD':true:'4.2-2'}}</div> • Async Pipe
 <div>{{ myObservable | async }}</div>
  13. Async Pipe import { Component } from '@angular/core'; import {

    Http } from '@angular/http';
 import 'rxjs/add/operator/map';
 @Component({ selector: 'app-attendee-list', template: `
 <h1>Conference Attendees</h1> <div *ngFor="let attendee of attendees"> {{ attendee.name }} </div> ` }) export class AttendeeListComponent { attendees: Attendee[];
 constructor(http: Http) {
 http.get('/api/attendees') .map(response => response.json()) .subscribe((result) => this.attendees = result);
 } } 
 
 
 of (attendees | async)"> </div> ` }) attendees: Observable<Attendee[]>;
 
 ; 
 } } this.attendees = http.get('/api/attendees') subscribe to the attendees observable
  14. Retry Operator 
 @Component({ selector: 'app-attendee-list', template: `
 <h1>Conference Attendees</h1>

    <div *ngFor="let attendee of attendees"> {{ attendee.name }} </div> ` }) export class AttendeeListComponent { attendees: Attendee[];
 constructor(http: Http) {
 http.get('/api/attendees') .retry(2)
 .map(response => response.json())
 
 
 
 of (attendees | async)"> </div> ` }) attendees: Observable<Attendee[]>;
 
 
 
 } } this.attendees = http.get('/api/attendees') retry 2x import { Component } from '@angular/core'; import { Http } from '@angular/http';
 import 'rxjs/add/operator/map'; import 'rxjs/add/operator/retry';
  15. HTTP Polling with timer & flatMap 
 @Component({ selector: 'app-attendee-list',

    template: `
 <h1>Conference Attendees</h1> <div *ngFor="let attendee of (attendees | async)"> {{ attendee.name }} </div> ` }) export class AttendeeListComponent { attendees: Attendee[];
 constructor(http: Http) {
 http.get('/api/attendees') .flatMap(() => http.get('/api/attendees'))
 .map(response => response.json())
 
 
 
 </div> ` }) attendees: Observable<Attendee[]>;
 
 
 
 } } this.attendees = Observable.timer(0, 3000) Emit the first value after
 0 milliseconds, then 
 every 3000 milliseconds import 'rxjs/add/operator/map'; import 'rxjs/add/operator/timer';
 import 'rxjs/add/operator/flatMap'; Map to inner Observable
 and emit output
  16. More Reactive APIs in Angular 2 • Forms (ReactiveFormsModule) •

    https://angular.io/docs/ts/latest/guide/forms.html • Router • https://angular.io/docs/ts/latest/tutorial/toh-pt5.html