洋葱模型的简单实现
用一段简单的代码,实现洋葱模型。
class App {
constructor() {
this.tasks = []; // 执行的方法队列
}
// 将方法添加到队列
use(...taskFunc) {
this.tasks.push(...taskFunc);
}
// 最中心执行的函数
do(ctx) {
console.log('do');
}
// 创建洋葱模型
dispatch(ctx, i) {
if (i === this.tasks.length) {
return () => this.do(ctx);
} else {
return () => this.tasks[i](ctx, this.dispatch(ctx, i + 1));
}
}
// 执行方法
run(ctx) {
return this.dispatch(Object.assign({}, ctx), 0)();
}
}
执行代码,
const app = new App();
app.use(async function(ctx, next) {
console.log(0);
await next();
console.log(2);
});
app.use(async function(ctx, next) {
console.log(1);
await next();
});
app.run();
会打印出如下结果。
0
1
do
2