Skip to content
This repository was archived by the owner on Dec 4, 2017. It is now read-only.

Commit 394b494

Browse files
Added section on error handling
1 parent cf36dc9 commit 394b494

File tree

8 files changed

+283
-33
lines changed

8 files changed

+283
-33
lines changed

public/docs/_examples/rxjs/ts/src/app/hero-counter.component.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export class HeroCounterComponent implements OnInit, OnDestroy {
2020
count: number = 0;
2121
counter$: Observable<number>;
2222
sub: Subscription;
23-
destroy$ = new Subject();
23+
onDestroy$ = new Subject();
2424

2525
ngOnInit() {
2626
this.counter$ = Observable.create((observer: Observer<number>) => {
@@ -30,12 +30,12 @@ export class HeroCounterComponent implements OnInit, OnDestroy {
3030
});
3131

3232
this.counter$
33-
.takeUntil(this.destroy$)
33+
.takeUntil(this.onDestroy$)
3434
.subscribe();
3535
}
3636

3737
ngOnDestroy() {
38-
this.destroy$.next();
38+
this.onDestroy$.complete();
3939
}
4040
}
4141
// #enddocregion
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// #docplaster
2+
// #docregion
3+
// #docregion retry-operator
4+
import 'rxjs/add/operator/retry';
5+
// #enddocregion retry-operator
6+
import 'rxjs/add/observable/of';
7+
// #docregion failed-heroes
8+
import { Component, OnInit } from '@angular/core';
9+
import { Observable } from 'rxjs/Observable';
10+
11+
import { HeroService } from './hero.service';
12+
import { Hero } from './hero';
13+
14+
@Component({
15+
template: `
16+
<h2>HEROES</h2>
17+
<ul class="items">
18+
<li *ngFor="let hero of heroes$ | async">
19+
<span class="badge">{{ hero.id }}</span> {{ hero.name }}
20+
</li>
21+
</ul>
22+
`
23+
})
24+
export class HeroListComponent implements OnInit {
25+
heroes$: Observable<Hero[]>;
26+
27+
constructor(
28+
private service: HeroService
29+
) {}
30+
31+
ngOnInit() {
32+
// #docregion failed-heroes
33+
this.heroes$ = this.service.getFailedHeroes()
34+
// #enddocregion failed-heroes
35+
.catch((error: any) => {
36+
console.log(`An error occurred: ${error}`);
37+
38+
return Observable.of([]);
39+
});
40+
// #docregion failed-heroes
41+
}
42+
}
43+
// #enddocregion
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// #docplaster
2+
// #docregion
3+
// #docregion retry-operator
4+
import 'rxjs/add/operator/retry';
5+
// #enddocregion retry-operator
6+
import 'rxjs/add/observable/of';
7+
import { Component, OnInit } from '@angular/core';
8+
import { Observable } from 'rxjs/Observable';
9+
10+
import { HeroService } from './hero.service';
11+
import { Hero } from './hero';
12+
13+
@Component({
14+
template: `
15+
<h2>HEROES</h2>
16+
<ul class="items">
17+
<li *ngFor="let hero of heroes$ | async">
18+
<span class="badge">{{ hero.id }}</span> {{ hero.name }}
19+
</li>
20+
</ul>
21+
`
22+
})
23+
export class HeroListComponent implements OnInit {
24+
heroes$: Observable<Hero[]>;
25+
26+
constructor(
27+
private service: HeroService
28+
) {}
29+
30+
ngOnInit() {
31+
this.heroes$ = this.service.getHeroes()
32+
.retry(3)
33+
.catch(error => {
34+
console.log(`An error occurred: ${error}`);
35+
36+
return Observable.of([]);
37+
});
38+
}
39+
}
40+
// #enddocregion
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
// #docplaster
2+
// #docregion
3+
// #docregion retry-when-operator
4+
import 'rxjs/add/operator/retryWhen';
5+
// #enddocregion retry-when-operator
6+
import 'rxjs/add/observable/of';
7+
import { Component, OnInit } from '@angular/core';
8+
import { Observable } from 'rxjs/Observable';
9+
10+
import { HeroService } from './hero.service';
11+
import { Hero } from './hero';
12+
13+
@Component({
14+
template: `
15+
<h2>HEROES</h2>
16+
<ul class="items">
17+
<li *ngFor="let hero of heroes$ | async">
18+
<span class="badge">{{ hero.id }}</span> {{ hero.name }}
19+
</li>
20+
</ul>
21+
`
22+
})
23+
export class HeroListComponent implements OnInit {
24+
heroes$: Observable<Hero[]>;
25+
26+
constructor(
27+
private service: HeroService
28+
) {}
29+
30+
ngOnInit() {
31+
this.heroes$ = this.service.getFailedHeroes()
32+
.retryWhen((errors: any) => {
33+
return errors.scan((errorCount, err) => {
34+
if (errorCount >= 2) {
35+
throw err;
36+
}
37+
38+
if (err.status !== 500) {
39+
return errorCount;
40+
} else {
41+
return errorCount + 1;
42+
}
43+
}, 0);
44+
})
45+
.catch(error => {
46+
console.log(`An error occurred: ${error}`);
47+
48+
return Observable.of([]);
49+
});
50+
}
51+
}
52+
// #enddocregion

public/docs/_examples/rxjs/ts/src/app/hero-list.component.ts

+11-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
// #docplaster
22
// #docregion
3+
// #docregion retry-operator
4+
import 'rxjs/add/operator/retry';
5+
// #enddocregion retry-operator
6+
import 'rxjs/add/observable/of';
37
import { Component, OnInit } from '@angular/core';
48
import { Observable } from 'rxjs/Observable';
59

@@ -24,7 +28,13 @@ export class HeroListComponent implements OnInit {
2428
) {}
2529

2630
ngOnInit() {
27-
this.heroes$ = this.service.getHeroes();
31+
this.heroes$ = this.service.getFailedHeroes()
32+
.retry(3)
33+
.catch(error => {
34+
console.log(`An error occurred: ${error}`);
35+
36+
return Observable.of([]);
37+
});
2838
}
2939
}
3040
// #enddocregion
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
// #docplaster
2+
// #docregion
3+
import 'rxjs/add/operator/map';
4+
import 'rxjs/add/operator/delay';
5+
import 'rxjs/add/operator/catch';
6+
import { Injectable } from '@angular/core';
7+
import { Http, Response, Headers } from '@angular/http';
8+
import { Observable } from 'rxjs/Observable';
9+
10+
import { Hero } from './hero';
11+
import { ApiError, ApiErrorHandlerService } from './api-error-handler.service';
12+
13+
@Injectable()
14+
export class HeroService {
15+
private headers = new Headers({'Content-Type': 'application/json'});
16+
private heroesUrl = 'api/heroes';
17+
18+
constructor(
19+
private http: Http,
20+
private errorHandler: ApiErrorHandlerService
21+
) {}
22+
23+
addHero(hero: Hero) {
24+
return this.http.post(this.heroesUrl, JSON.stringify({ name: hero.name }), { headers: this.headers });
25+
}
26+
27+
getHeroes(): Observable<Hero[]> {
28+
return this.http.get(this.heroesUrl)
29+
.map(response => response.json().data as Hero[]);
30+
}
31+
32+
getFailedHeroes(): Observable<any> {
33+
return this.http.get(`${this.heroesUrl}/failed`)
34+
}
35+
36+
getHero(id: number): Observable<Hero> {
37+
const url = `${this.heroesUrl}/${id}`;
38+
return this.http.get(url)
39+
.map(response => response.json().data as Hero);
40+
}
41+
42+
search(term: string): Observable<Hero[]> {
43+
return this.http
44+
.get(`${this.heroesUrl}/?name=${term}`)
45+
.map((r: Response) => r.json().data as Hero[]);
46+
}
47+
}

public/docs/_examples/rxjs/ts/src/app/hero.service.ts

+6-3
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,14 @@ export class HeroService {
2929
.map(response => response.json().data as Hero[]);
3030
}
3131

32-
getHero(id: number): Observable<Hero | ApiError> {
32+
getFailedHeroes(): Observable<any> {
33+
return this.http.get(`${this.heroesUrl}/failed`)
34+
}
35+
36+
getHero(id: number): Observable<Hero> {
3337
const url = `${this.heroesUrl}/${id}`;
3438
return this.http.get(url)
35-
.map(response => response.json().data as Hero)
36-
.catch(this.errorHandler.handle);
39+
.map(response => response.json().data as Hero);
3740
}
3841

3942
search(term: string): Observable<Hero[]> {

0 commit comments

Comments
 (0)