forked from gridu/TYPESCRIPT_FOR_STUDENTS
-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
127 lines (103 loc) · 2.17 KB
/
index.js
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
class Observer {
constructor(handlers) {
this.handlers = handlers;
this.isUnsubscribed = false;
}
next(value) {
if (this.handlers.next && !this.isUnsubscribed) {
this.handlers.next(value);
}
}
error(error) {
if (!this.isUnsubscribed) {
if (this.handlers.error) {
this.handlers.error(error);
}
this.unsubscribe();
}
}
complete() {
if (!this.isUnsubscribed) {
if (this.handlers.complete) {
this.handlers.complete();
}
this.unsubscribe();
}
}
unsubscribe() {
this.isUnsubscribed = true;
if (this._unsubscribe) {
this._unsubscribe();
}
}
}
class Observable {
constructor(subscribe) {
this._subscribe = subscribe;
}
static from(values) {
return new Observable((observer) => {
values.forEach((value) => observer.next(value));
observer.complete();
return () => {
console.log('unsubscribed');
};
});
}
subscribe(obs) {
const observer = new Observer(obs);
observer._unsubscribe = this._subscribe(observer);
return ({
unsubscribe() {
observer.unsubscribe();
}
});
}
}
const HTTP_POST_METHOD = 'POST';
const HTTP_GET_METHOD = 'GET';
const HTTP_STATUS_OK = 200;
const HTTP_STATUS_INTERNAL_SERVER_ERROR = 500;
const userMock = {
name: 'User Name',
age: 26,
roles: [
'user',
'admin'
],
createdAt: new Date(),
isDeleated: false,
};
const requestsMock = [
{
method: HTTP_POST_METHOD,
host: 'service.example',
path: 'user',
body: userMock,
params: {},
},
{
method: HTTP_GET_METHOD,
host: 'service.example',
path: 'user',
params: {
id: '3f5h67s4s'
},
}
];
const handleRequest = (request) => {
// handling of request
return {status: HTTP_STATUS_OK};
};
const handleError = (error) => {
// handling of error
return {status: HTTP_STATUS_INTERNAL_SERVER_ERROR};
};
const handleComplete = () => console.log('complete');
const requests$ = Observable.from(requestsMock);
const subscription = requests$.subscribe({
next: handleRequest,
error: handleError,
complete: handleComplete
});
subscription.unsubscribe();