洋葱模型代码-可以在浏览器执行
葱模型中的每一层实际上就是一个中间件。请求进入时会一层一层通过中间件处理,每一层都可以决定是否继续传递给下一层,或者处理完后返回响应。
代码如下
class Onion {
middlewares = [];
use(fn) {
// 添加插件
if (this.middlewares.indexOf(fn) < 0) {
this.middlewares.push(fn);
}
}
//执行插件
run() {
let middlewares = this.middlewares;
const that = this;
// 执行方法主体
function dispatch(i) {
if (i >= middlewares.length) return;
const middleware = middlewares[i];
try {
return Promise.resolve(middleware(that, dispatch.bind(null, i + 1)));
} catch (err) {
return Promise.reject(err);
}
}
// 从执行第一个方法开始
return dispatch(0);
}
}
const app = new Onion();
app.use(function (context, next) {
console.log(1);
next();
console.log(111);
});
app.use(function (context, next) {
console.log(2);
next();
console.log(222);
});
app.run();