Skip to content

Commit 99e5642

Browse files
Updated several design pattern examples
1 parent f6b107b commit 99e5642

39 files changed

+1584
-252
lines changed

Kapitel7/AsyncAsyncControl.example.js

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
const AsyncAsyncControl = require('./AsyncAsyncControl');
2+
const control = new AsyncAsyncControl();
3+
await control.play();
4+
await control.pause();
5+
6+

Kapitel7/AsyncAsyncControl.js

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
module.exports = class AsyncAsyncControl {
2+
3+
async next(callback) {
4+
console.log('Next song');
5+
setTimeout(callback, 500);
6+
}
7+
8+
async pause(callback) {
9+
console.log('Pause');
10+
setTimeout(callback, 500);
11+
}
12+
13+
async play(callback) {
14+
console.log('Play');
15+
setTimeout(callback, 500);
16+
}
17+
18+
async previous(callback) {
19+
console.log('Previous song');
20+
setTimeout(callback, 500);
21+
}
22+
23+
async select(track, callback) {
24+
console.log(`Select track ${track}`);
25+
setTimeout(callback, 500);
26+
}
27+
28+
async stop(callback) {
29+
console.log('Stop');
30+
setTimeout(callback, 500);
31+
}
32+
}

Kapitel7/AsyncControl.example.js

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
const AsyncControl = require('./AsyncControl');
2+
const control = new AsyncControl();
3+
control
4+
.play(() => {
5+
control.pause(() => {
6+
control.select(7, () => {
7+
control.play(() => {
8+
control.next(() => {
9+
control.previous(() => {
10+
control.play(() => {
11+
control.stop(() => {
12+
console.log('Finished');
13+
});
14+
})
15+
});
16+
});
17+
});
18+
});
19+
});
20+
});

Kapitel7/AsyncControl.js

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
module.exports = class AsyncControl {
2+
3+
next(callback) {
4+
console.log('Next song');
5+
setTimeout(callback, 500);
6+
}
7+
8+
pause(callback) {
9+
console.log('Pause');
10+
setTimeout(callback, 500);
11+
}
12+
13+
play(callback) {
14+
console.log('Play');
15+
setTimeout(callback, 500);
16+
}
17+
18+
previous(callback) {
19+
console.log('Previous song');
20+
setTimeout(callback, 500);
21+
}
22+
23+
select(track, callback) {
24+
console.log(`Select track ${track}`);
25+
setTimeout(callback, 500);
26+
}
27+
28+
stop(callback) {
29+
console.log('Stop');
30+
setTimeout(callback, 500);
31+
}
32+
}

Kapitel7/AsyncControlPromises.js

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
module.exports = class AsyncControlPromises {
2+
3+
next() {
4+
console.log('Next song');
5+
return new Promise((resolve, reject) => {
6+
setTimeout(resolve, 500);
7+
});
8+
}
9+
10+
pause() {
11+
console.log('Pause');
12+
return new Promise((resolve, reject) => {
13+
setTimeout(resolve, 500);
14+
});
15+
}
16+
17+
play() {
18+
console.log('Play');
19+
return new Promise((resolve, reject) => {
20+
setTimeout(resolve, 500);
21+
});
22+
}
23+
24+
previous() {
25+
console.log('Previous song');
26+
return new Promise((resolve, reject) => {
27+
setTimeout(resolve, 500);
28+
});
29+
}
30+
31+
select(track) {
32+
console.log(`Select track ${track}`);
33+
return new Promise((resolve, reject) => {
34+
setTimeout(resolve, 500);
35+
});
36+
}
37+
38+
stop() {
39+
console.log('Stop');
40+
return new Promise((resolve, reject) => {
41+
setTimeout(resolve, 500);
42+
});
43+
}
44+
45+
}
+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
const FluentAsyncControl = require('./FluentAsyncControl');
2+
const control = FluentAsyncControl.build();
3+
control
4+
.play()
5+
.pause()
6+
.select(7)
7+
.play()
8+
.next()
9+
.previous()
10+
.play()
11+
.stop();

Kapitel7/FluentAsyncControl.js

+104
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
class FluentAsyncControl {
2+
3+
next(callback) {
4+
console.log('Next song');
5+
setTimeout(() => {
6+
console.log('Next song callback');
7+
if (typeof callback === 'function') {
8+
callback();
9+
}
10+
}, 500);
11+
}
12+
13+
pause(callback) {
14+
console.log('Pause');
15+
setTimeout(() => {
16+
console.log('Pause callback');
17+
if (typeof callback === 'function') {
18+
callback();
19+
}
20+
}, 500);
21+
}
22+
23+
play(callback) {
24+
console.log('Play');
25+
setTimeout(() => {
26+
console.log('Play callback');
27+
if (typeof callback === 'function') {
28+
callback();
29+
}
30+
}, 500);
31+
}
32+
33+
previous(callback) {
34+
console.log('Previous song');
35+
setTimeout(() => {
36+
console.log('Previous song callback');
37+
if (typeof callback === 'function') {
38+
callback();
39+
}
40+
}, 500);
41+
}
42+
43+
select(track, callback) {
44+
console.log(`Select track ${track}`);
45+
setTimeout(() => {
46+
console.log('Select track callback');
47+
if (typeof callback === 'function') {
48+
callback();
49+
}
50+
}, 500);
51+
}
52+
53+
stop(callback) {
54+
console.log('Stop');
55+
setTimeout(() => {
56+
console.log('Stop callback');
57+
if (typeof callback === 'function') {
58+
callback();
59+
}
60+
}, 500);
61+
}
62+
63+
}
64+
65+
const API = (previousActions = Promise.resolve(), instance) => {
66+
return {
67+
next: () =>
68+
API(previousActions
69+
.then(() => new Promise((resolve, reject) => {
70+
instance.next(resolve);
71+
})), instance),
72+
pause: () =>
73+
API(previousActions
74+
.then(() => new Promise((resolve, reject) => {
75+
instance.pause(resolve);
76+
})), instance),
77+
play: () =>
78+
API(previousActions
79+
.then(() => new Promise((resolve, reject) => {
80+
instance.play(resolve);
81+
})), instance),
82+
previous: () =>
83+
API(previousActions
84+
.then(() => new Promise((resolve, reject) => {
85+
instance.previous(resolve);
86+
})), instance),
87+
select: (track) =>
88+
API(previousActions
89+
.then(() => new Promise((resolve, reject) => {
90+
instance.select(track, resolve);
91+
})), instance),
92+
stop: () =>
93+
API(previousActions
94+
.then(() => new Promise((resolve, reject) => {
95+
instance.stop(resolve);
96+
})), instance)
97+
};
98+
}
99+
100+
const build = () => {
101+
const control = new FluentAsyncControl();
102+
return API(undefined, control);
103+
}
104+
module.exports.build = build;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
const FluentAsyncControlAsyncAwait = require('./FluentAsyncControlAsyncAwait');
2+
const control = FluentAsyncControlAsyncAwait.build();
3+
control
4+
.play()
5+
.pause()
6+
.select(7)
7+
.play()
8+
.next()
9+
.previous()
10+
.play()
11+
.stop();
+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
class FluentAsyncControlAsyncAwait {
2+
3+
next() {
4+
console.log('Next song');
5+
return new Promise((resolve, reject) => {
6+
setTimeout(resolve, 500);
7+
});
8+
}
9+
10+
pause() {
11+
console.log('Pause');
12+
return new Promise((resolve, reject) => {
13+
setTimeout(resolve, 500);
14+
});
15+
}
16+
17+
play() {
18+
console.log('Play');
19+
return new Promise((resolve, reject) => {
20+
setTimeout(resolve, 500);
21+
});
22+
}
23+
24+
previous() {
25+
console.log('Previous song');
26+
return new Promise((resolve, reject) => {
27+
setTimeout(resolve, 500);
28+
});
29+
}
30+
31+
select(track) {
32+
console.log(`Select track ${track}`);
33+
return new Promise((resolve, reject) => {
34+
setTimeout(resolve, 500);
35+
});
36+
}
37+
38+
stop() {
39+
console.log('Stop');
40+
return new Promise((resolve, reject) => {
41+
setTimeout(resolve, 500);
42+
});
43+
}
44+
45+
}
46+
47+
const wrap = async (previousActions, instance, method, ...args) => {
48+
await previousActions;
49+
await instance[method](...args);
50+
}
51+
52+
const API = (previousActions = Promise.resolve(), instance) => {
53+
return {
54+
next: () => API(wrap(previousActions, instance, 'next'), instance),
55+
pause: () => API(wrap(previousActions, instance, 'pause'), instance),
56+
play: () => API(wrap(previousActions, instance, 'play'), instance),
57+
previous: () => API(wrap(previousActions, instance, 'previous'), instance),
58+
select: (track) => API(wrap(previousActions, instance, 'select', track), instance),
59+
stop: () => API(wrap(previousActions, instance, 'stop'), instance)
60+
};
61+
}
62+
63+
const build = () => {
64+
const control = new FluentAsyncControlAsyncAwait();
65+
return API(undefined, control);
66+
}
67+
module.exports.build = build;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
const FluentAsyncControlOptimized = require('./FluentAsyncControlOptimized');
2+
const control = FluentAsyncControlOptimized.build();
3+
control
4+
.play()
5+
.pause()
6+
.select(7)
7+
.play()
8+
.next()
9+
.previous()
10+
.play()
11+
.stop();

0 commit comments

Comments
 (0)