-
Notifications
You must be signed in to change notification settings - Fork 19
Expand file tree
/
Copy pathobservable_error_failover.js
More file actions
103 lines (83 loc) · 2.73 KB
/
Copy pathobservable_error_failover.js
File metadata and controls
103 lines (83 loc) · 2.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
function getData(){
var beers = [
{name: "Stella", country: "Belgium", price: 9.50},
{name: "Sam Adams", country: "USA", price: 8.50},
{name: "Bud Light", country: "USA", price: 6.50},
{name: "Brooklyn Lager", country: "USA", price: 8.00},
{name: "Sapporo", country: "Japan", price: 7.50}
];
return Rx.Observable.create( observer => {
let counter = 0;
beers.forEach( beer => {
observer.next(beer);
counter++;
if (counter > Math.random()*5) { // Randomly generate an error
observer.error(
{
status: 500,
description: "Beer stream error"
}
);
} else{
emulateDelayInSeconds(1);
}
}
);
observer.complete();}
);
}
function emulateDelayInSeconds(seconds)
{
var e = new Date().getTime() + (seconds * 1000);
while (new Date().getTime() <= e) {} // just keep the CPU busy
}
// The subscriber
getData()
.catch(err => { // failover
console.error("Got " + err.status + ": " + err.description);
if (err.status === 500){
console.error("Switching to streaming cached data");
return getCachedData();
} else{
console.error("Switching to another beer service");
return getDataFromAnotherService();
}
})
.map(beer => beer.name + ", " + beer.country)
.subscribe(
beer => console.log("Subscriber got " + beer),
err => console.error(err),
() => console.log("The stream is over")
);
function getCachedData(){
var beers = [
{name: "Leffe Blonde", country: "Belgium", price: 9.50},
{name: "Miller Lite", country: "USA", price: 8.50},
{name: "Corona", country: "Mexico", price: 8.00},
{name: "Asahi", country: "Japan", price: 7.50}
];
return Rx.Observable.create( observer => {
beers.forEach( beer => {
observer.next(beer);
emulateDelayInSeconds(1);
}
);
observer.complete();}
);
}
function getDataFromAnotherService(){
var beers = [
{name: "Peroni", country: "Italy", price: 9.50},
{name: "Heineken", country: "Holland", price: 8.50},
{name: "Beck", country: "Germany", price: 8.00},
{name: "Kingfisher", country: "India", price: 7.50}
];
return Rx.Observable.create( observer => {
beers.forEach( beer => {
observer.next(beer);
emulateDelayInSeconds(1);
}
);
observer.complete();}
);
}