-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathindex.js
More file actions
59 lines (42 loc) Β· 964 Bytes
/
index.js
File metadata and controls
59 lines (42 loc) Β· 964 Bytes
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
class Express {
middlewares = [];
use(fn) {
this.middlewares.push(fn);
}
start() {
let ctx = {};
this.composeMiddlewares(ctx);
}
composeMiddlewares(ctx) {
for (let fn of this.middlewares) {
if (fn !== fn) throw Error('middleware must be a function!');
}
function run(ctx, middlewares) {
dispatch();
function dispatch() {
let fn = middlewares.shift();
if (!fn) return Promise.resolve(ctx);
try {
return Promise.resolve(fn(ctx, dispatch.bind(null, ctx)));
} catch (err) {
return Promise.reject(err);
}
};
}
run(ctx, this.middlewares);
}
}
const app = new Express();
const delay = () => new Promise((res) => setTimeout(res, 4000))
app.use(async (ctx, next) => {
console.log(1);
next();
console.log(2);
});
app.use(async (ctx, next) => {
console.log(3)
await delay();
next();
console.log(4)
});
app.start();