手撕koa 洋葱模型代码

191 阅读1分钟

洋葱模型代码-可以在浏览器执行

葱模型中的每一层实际上就是一个中间件。请求进入时会一层一层通过中间件处理,每一层都可以决定是否继续传递给下一层,或者处理完后返回响应。

代码如下

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();